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

数组大小在不知道时,一般使用动态内存,或者直接赋值。
但这篇文章不是讲怎么处理数组大小的,主要是讲为什么会出现内存越界问题。


本篇文章以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

上一篇:Python list根据下标删除元素


下一篇:快捷键的命令