首页 > 编程语言 > 详细

C/C++如何解决数组内存越界问题

时间:2021-02-24 23:46:32      阅读:31      评论:0      收藏:0      [点我收藏+]
数组大小在不知道时,一般使用动态内存,或者直接赋值。
但这篇文章不是讲怎么处理数组大小的,主要是讲为什么会出现内存越界问题。


本篇文章以C代码示范


数组里放的除了数字就是字符,我们就只讨论这两种情况。

整型数组

字符串数组


整型数组

我们来看这一段代码

int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);

sz输出为10.
我们可以这么认为:整型数组中的元素有多少个,那么此数组的大小就为多小。也可以说:

int arr[10];

arr里可以存放最多可以存放10个范围内的整型元素。

字符串数组

当我们要在数组内存一个字符串时,会出现什么情况呢?

char b[] = "abcdef";
int sz = sizeof(b) / sizeof(b[0]);

sz的结果是6吗?
在编译器上编译后,sz的结果其实是7.
我们再看这行代码

int len = strlen("abcdef");//引用头文件string.h

来求一下字符串"abcdef"的长度。
len结果为6
strlen函数在使用时,从第一个字符开始算,遇到‘\0‘时结束。
所以我们可以认为字符串"abcdef"在存到数组中,实际上存的是"abcdef\0".
事实也确实如此,在《C++ Primer(第五版)》(学C我没看过书)中这样写道:

字符串字面值的类型实际上是由常量字符构成的数组(array)。编译器在每个字符串的结尾处添加一个空字符(’\0’),因此,字符串字面值的实际长度要比它的内容多一。例如,字面值’A’表示的就是单独的字符A,而字符串“A”则代表了一个字符的数组,该数组包含两个字符:一个是字母 A,另一个是空字符。

所以,我们在将字符串存到数组中时,就要注意数组是否足够大到能存放我们要存的内容。


小练习

#include <stdio.h>
void characterdel(char* p, char* del)
{
    //
}
int main()
{
    char arr[10] = { 0 };
    char del[3] = { 0 };
    int c;
    printf("请输入最大长度为9的字符串:>");
    scanf("%s", &arr);
    while ((c = getchar()) != EOF && c != ‘\n‘);
    printf("请输入你要删除的字符:>");
    scanf("%s", &del);
    characterdel(arr, del);
    return 0;
}

我们要定义了两个char类型的数组arr与del,分别最大可放10个与3个字符。
要是我们输入时
arr取"abcdefghij"或del取"abc"时,
均会产生内存越界的问题:
arr一共向内存申请10个字节,这10个字节给了"abcdefghij"时,‘\0‘跑到第十一个字节去了,所以内存越界了。


o( ̄▽ ̄)o

C/C++如何解决数组内存越界问题

原文:https://blog.51cto.com/15093262/2635925

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!