字符數組和字符串數組


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