demo
int _tmain(int argc, _TCHAR* argv[]) { char a[5] = {1,2,3,4,5}; //字符数组 char b[5] = {1,2,3,4,'\0'}; //字符数组,也可以叫字符串数组;a[5]不可以叫字符串数组 char c[5] = "test"; //字符数组,也可以叫字符串数组,a[5]不可以叫字符串数组 int arry[5] = {10000,2147483647,2147483647,2147483647,2147483647}; //整型数组 getchar(); return 0; }
- a 0x00cffc70 "烫烫烫烫烫蘆" char [5] [0] 1 '' char [1] 2 '' char [2] 3 '' char [3] 4 '' char [4] 5 '' char strlen(a) 18 int sizeof(a) 5 unsigned int - b 0x00cffc60 "" char [5] [0] 1 '' char [1] 2 '' char [2] 3 '' char [3] 4 '' char [4] 0 char strlen(b) 4 int sizeof(b) 5 unsigned int - c 0x00cffc50 "test" char [5] [0] 116 't' char [1] 101 'e' char [2] 115 's' char [3] 116 't' char [4] 0 char strlen(c) 4 int sizeof(c) 5 unsigned int - arry 0x00cffc34 int [5] [0] 10000 int [1] 2147483647 int [2] 2147483647 int [3] 2147483647 int [4] 2147483647 int strlen(arry) 2 int sizeof(arry) 20 unsigned int
1.字符数组的数组长度不等于数组的元素个数
从字符数组b,可以看到我们存放了5个字符,最后的一个字符是结束符,计算长度时并没有计算它。
2.对于字符数组。通常会以strlen来计算数组长度,或者计算数组元素个数,以sizeof计算数组内存大小。
例如字符数组a,很明显看到,strlen无法计算出数组的长度;而通过sizeof计算,由于字符的特殊性,计算出的数组内存大小刚好等于数组长度。
而通过字符数组b,可以看到,strlen计算出数组的长度,sizeof计算出的内存大小比strlen多一个字节,即字符串的结束符(空字符)占据数组的内存空间。
3.字符数组c。通过字符串常量进行赋值,可以达到给字符数组b扶植表达式同样的效果。
4.对于整形数组。
- 不能用strlen来计算数组元素个数,或者计算数组长度。strlen是用来计算字符串的。
- sizeof用来计算数组占据的内存空间大小。
问题
在“字符串数组 Debug 系统回收空间引起程序崩溃”随笔中提到,当结束函数调用时,Debug下,系统回收字符串数组空间,会引起程序崩溃(不中断,可以继续执行)。然而在这里我们的字符串数组a,在函数结束时并没有引起程序崩溃,同样在栈上,产生的结果不同。
- a 0x009ff860 "烫烫烫虓2励?" char [5] [0] 1 '' char [1] 2 '' char [2] 3 '' char [3] 4 '' char [4] 5 '' char strlen(a) 19 int sizeof(a) 5 unsigned int - b 0x009ff850 "" char [5] [0] 1 '' char [1] 2 '' char [2] 3 '' char [3] 4 '' char [4] 0 char strlen(b) 4 int sizeof(b) 5 unsigned int - c 0x009ff840 "test" char [5] [0] 116 't' char [1] 101 'e' char [2] 115 's' char [3] 116 't' char [4] 0 char strlen(c) 4 int sizeof(c) 5 unsigned int - arry 0x009ff824 int [5] [0] 10000 int [1] 2147483647 int [2] 2147483647 int [3] 2147483647 int [4] 2147483647 int strlen(arry) 2 int sizeof(arry) 20 unsigned int sztest CXX0017: 错误: 没有找到符号“sztest” strlen(sztest) CXX0017: 错误: 没有找到符号“sztest” sizeof(sztest) CXX0017: 错误: 没有找到符号“sztest”
- sztest 0x009ff740 "005" char [3] [0] 48 '0' char [1] 48 '0' char [2] 53 '5' char strlen(sztest) 3 int sizeof(sztest) 3 unsigned int
- a 0x009ff860 "烫烫烫虓2励?" char [5] [0] 1 '' char [1] 2 '' char [2] 3 '' char [3] 4 '' char [4] 5 '' char strlen(a) 19 int sizeof(a) 5 unsigned int - b 0x009ff850 "" char [5] [0] 1 '' char [1] 2 '' char [2] 3 '' char [3] 4 '' char [4] 0 char strlen(b) 4 int sizeof(b) 5 unsigned int - c 0x009ff840 "test" char [5] [0] 116 't' char [1] 101 'e' char [2] 115 's' char [3] 116 't' char [4] 0 char strlen(c) 4 int sizeof(c) 5 unsigned int - arry 0x009ff824 int [5] [0] 10000 int [1] 2147483647 int [2] 2147483647 int [3] 2147483647 int [4] 2147483647 int strlen(arry) 2 int sizeof(arry) 20 unsigned int - sztest 0x009ff740 "005" char [3] [0] 48 '0' char [1] 48 '0' char [2] 53 '5' char strlen(sztest) 3 int sizeof(sztest) 3 unsigned int