字符數組(用sizeof和strlen計算長度的說明)


strlen(char[]):計算一個字符數組中\0之前的所有字符數量

sizeof(char[]):計算字符數組實際占用空間長度

當我們執行以下代碼片段時

char arr[] = "abc";
char arr2[] = {'a','b','c'};
printf("%s\n", arr);
printf("%s\n", arr2);

輸出結果為:

abc abc燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙虜恄U?

當我們在visual studio中跟蹤時,會發現arr在字符串最后面添加了一個'\0',也就是說arr數組的實際長度比字面長度多了一個字節的長度,而arr2還是數組的實際長度3。

當我們修改上述代碼,在arr2末尾增加一個0

char arr[] = "abc";
char arr2[] = {'a','b','c',0};
printf("%s\n", arr);
printf("%s\n", arr2);

此時運行后,結果相同。由此可以推斷,'\0'和0相等,都代表字符串的結束標志,當定義字符串數組時,實際上系統是在字符串字面量末尾增加了一個'\0',也就是int類型的0。

字符串常量系統會自動在結尾增加一個字符\0,該結論通過以下語句就更容易理解了

printf("%s",sizeof("hello"));

輸出結果為:6

當輸出不帶0的arr2時,當系統沒遇見0時,也就是說沒遇見字符串結束標志時,系統就是一直打印它后面的字符,直到遇見0字符位置為止

第一種情況

char arr[3];//定義一個數組,並開辟了3個字符空間,但是沒有初始化。

strlen(arr);//結果為隨機數。

解釋:arr定義后但沒初始化,此時3個元素都為隨機值。strlen開始執行直到遇見\0為止,並返回非0字符,當超過arr的上界后,比較不會停止,會超出arr的內存空間界限向后一直比較,直到遇見\0,所以strlen返回隨機值。

sizeof(arr);//結果:3

解釋:sizeof只計算arr的長度,此時arr的長度是確定的,也就是3,那么sizeof為3

第二種情況

char arr[3] = {0,1};//arr數組長度確定,初始化了2個字符,第一個字符是0,也就是空字符

strlen(arr);//結果:0。

解釋:strlen計算的原則是遇見0字符就返回。arr第一個字符就是0,當然返回0了。

sizeof(arr);//結果:3

解釋:sizeof只計算arr的長度,此時arr的長度是確定的,無論初始化多少字符,sizeof只計算分配的空間大小,即3。

第三種情況

char arr[] = {0,1};//數組長度不固定,有初始值

strlen(arr);//結果:0。

解釋:strlen計算的原則是遇見0字符就返回。arr第一個字符就是0,當然返回0了。

如果數組定義為:char arr[] = {1,2,0,3,6,9};那么結果就為2

sizeof(arr);//結果:2

解釋:sizeof只計算arr的長度,此時arr的長度沒有預先分配,那么數組長度就由初始化的字符決定其長度,此時有2個字符,那么結果就為2。

第四種情況

char arr[3] ="abc";//數組長度固定,並且和初始化字符串長度一致

strlen(arr);//結果:隨機值。

解釋:字符串字面量的實際長度是字符個數+1,但arr定義時已經把長度固定了,abc剛好放到arr中,而abc結尾的\0無處放置,被數組丟棄,當執行strlen時,它會超過數組上界,從后面的內存空間中查找\0,所以返回的是一個隨機值。

sizeof(arr);//結果為3

解釋:一般性的判斷標准就是,只要數組的長度固定了,sizeof就返回定義時的長度,此處為3。

第五種情況

char arr[3] ="ab";//數組長度固定,並且初始化字符串長度小於數組長度

strlen(arr);//結果:2。

解釋:"ab"后面包含一個\0。這三個字符都能放入數組中,strlen找到\0后,返回前面的字符長度

sizeof(arr);//結果為3

解釋:一般性的判斷標准就是,只要數組的長度固定了,sizeof就返回定義時的長度,此處為3。

第六種情況

char arr[] ="ab";

strlen(arr);//結果:2。

解釋:"ab"后面包含一個\0。這三個字符都能放入數組中,strlen找到\0后,返回前面的字符長度

sizeof(arr);//結果為3

解釋:此時的arr沒有指定長度,其長度由保存的字符串長度決定,“ab”的實際長度為3,所以結果為3

結論:

strlen會超出字符數組的邊界,直到找到\0字符為止,同時返回前面的字符數量

sizeof只在當前定義的數組邊界范圍內確定數組的長度。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM