因为是半路出家学习cpp的,所以经常会对c语言里面的字符数组感到困惑,这次一次性做个总结。
- 首先,结束位’/0‘只针对字符数组,不针对整型或者其他数组。
- 其次,字符数组的大小只针对里面的字符的个数,和结束位无关。char i[1] = “1”; char i[] = {’1‘}; 和 char i[1]; 两个数组大小都是1。但是char i[] = “1”的大小是2,这种定义类似于char i[] = {‘1’, ‘\0’};。另外指针只能定义字符串char *i = “1”;不能写成char *i = {‘1’};
- 一般而言,字符数组的size要超过里面元素的个数。这样的目的是保证结束位置在数组分配的内存地址里面。
- 例如char i[1] = ‘1’; 和 char i[2] = ‘1’; 这两个字符数组在定义完之后,其最后一个元素’1‘后面都是结束位’/0‘,只不过一个是在数组分配的内存之外、一个在内部。在程序比较庞大的情况下,由于第一个结束位不在系统分配给数组的内存里面,属于“自由内存”,后面操作系统完全可以把他分配给其他变量,一旦操作系统把这个地址分配给其他变量那么第一个数组便失去了结束位,再利用printf(“s%”, i); 或者其他strcpy之类的函数操作时便会访问到数组之外的内存,直到再恰好碰到下一个结束位。
- 在查这个资料的时候发现这样一段代码:
#include <stdio.h>
int main(void)
{
char str1[5];
char str2[5];
int i;
for(i=0;i<5;i++)
{
str1[i]=i+65;
str2[i]=i+97;
}
printf("%s\n%s\n",str1,str2);
return 0;
}
输出:
以及#include <stdio.h>
int main(void)
{
char str1[16];
char str2[16];
int i;
for(i=0;i<16;i++)
{
str1[i]=i+65;
str2[i]=i+97;
}
printf("%s\n%s\n",str1,str2);
return 0;
}
其输出为:
说明了两个问题:
- 局部变量存储在栈上,栈的地址向下生长,所以str2的地址小于str1,这点可以在第二个代码中看出来——输出str2的时候实际输出是str2+str1,证明str2在低地址。另外从输出顺序来看,数组里面的内容依然是向上生长的。
- 查阅资料发现一个事实:连续定义的两个数组,当数组str2的长度小于等于16时,两数组头元素的距离为16;当数组str2的长度超过16但小于等于32时,两数组头元素的距离会变成32;当数组str2的长度超过32但小于等于48时,两数组头元素的距离会变成48;所以,一旦当str2数组大小为16、32、48……时,str1的结束位就会被覆盖掉,输出(%s,str2)时就会连带输出str1。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)