我在下面創建了兩個陣列“TEST”和“arr”,都包含字符“ABCDE”。
#include <stdio.h>
#define TEST "ABCDE"
int main()
{
char arr[5];
int i;
for(i=0;i<5;i )
{
arr[i] = i 65;
}
printf("%s\n",arr);
printf("%zd %zd",sizeof arr,sizeof TEST);
return 0;
}
輸出是
ABCDE
5 6
考慮到這兩個陣列都攜帶 5 個字符,為什么它們的大小不同?(我知道每個字串的末尾都有一個空字符。)
uj5u.com熱心網友回復:
宏展開后,行
printf("%zd %zd",sizeof arr,sizeof TEST);
將會:
printf("%zd %zd",sizeof arr,sizeof "ABCDE" );
字串文字將始終添加一個終止空字符。因此,字串文字的型別是char[6]. sizeof "ABCDE"因此,運算式的計算結果為6。
但是,型別arr是char[5]。不會自動添加空終止字符的空格。因此,運算式的sizeof arr計算結果為5。
此外,值得注意的是,以下行導致未定義行為:
printf("%s\n",arr);
該%s printf格式說明需要一個空結束的字串。但是,arr不是空終止的。
如果要列印陣列,則必須限制列印到的字符數5,如下所示:
printf( "%.5s\n", arr );
或者,如果您不想將長度硬編碼到格式字串中,您也可以這樣做:
printf( "%.*s\n", (int)sizeof arr, arr );
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/397326.html
