字符数组和字符串数组


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.对于整形数组。

  1. 不能用strlen来计算数组元素个数,或者计算数组长度。strlen是用来计算字符串的。
  2. 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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM