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