天天看点

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;
}