1、数组的访问越界问题
//数组访问越界
int main()
{
int m = 10;
int a[5] = {1,2,3,4,5};
a[5] = 6;
a[6] = 7;
a[7] = 8;
int n = 100;
printf("m=%d;n=%d\n", m,n);
}
结果:
原因:
通过查看变量的内存地址:
由下图,可以看出变量在创建的时候是以高地址创建变量,并且windows有8字节的保护(cc cc cc cc cc cc cc cc);
数组访问时,由低地址到高地址,所以当我们超过数组长度进行赋值时,就会超过数组的长度,而产生访问越界的问题。
变量m的地址为:0x00EFFBF4;
变量n的地址为:0x00EFFBCC;
数组a的首地址:0x00EFFBD8;
2、字符数组的初始化问题;
(1)字符数组因为最后要有个’\0’表示字符结束,所以要最少留一个位置来存储;
(2)字符数组要尽量进行初始化,如果不进行默认初始化不会加’\0’;
//字符数组
void demo02() {
char cha[5];
cha[0] = 'h';
cha[1] = 'h';
cha[2] = 'h';
cha[3] = 'h';
printf("%s\n",cha);
}
结果:
原因:
查看内存地址:
cc cc两个字节表示的汉字就是烫,后面类似,直到遇到了0就结束。
可以看到默认是没有‘0’的;
建议在使用字符数组是,都进行初始化:
//字符数组
void demo02() {
char cha[5] = {0}; // 初始化
cha[0] = 'h';
cha[1] = 'h';
cha[2] = 'h';
cha[3] = 'h';
printf("%s\n",cha);
}
结果:就没有乱码了;