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


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