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