2010-09-30 171 views

回答

16

有在端部的後'\0'

+0

這就是我想的....謝謝。 – 2010-09-30 22:29:34

5

它與#define無關。的字符陣列將具有相同的大小:

const char str[] = { "test1" }; 
sizeof (str) == 6 

原因此字符串是6個字節長的是,在C字符串具有終止NUL字符來標記結束。

+2

這不是一個數組,它是一個指向字符串的指針,'sizeof(str)'將返回機器指針類型的大小。 – 2010-09-30 22:31:12

+1

這意味着什麼'const char str [] =「test1」;'與const char str [] = {'t','e','s','t','1 ','\ 0'};' – aschepler 2010-09-30 22:33:40

+1

恩,是的。我感覺真的很糟糕,尤其是因爲我在輸入答案之前考慮了sizeof指針和sizeof指針之間的區別,然後我的手指反正敲錯了鍵。 – 2010-09-30 22:38:00

2

字符串中C是char小號陣列,具有空終止即它們與\0結束。常見的替代方法是Pascal樣式的字符串,其中字符串存儲不帶空終止符的數組char,並將字符串的長度存儲在某處。

+1

在C和C++以及字符串文字的語境中談到Pascal字符串是非常具有誤導性的。 – 2010-09-30 22:39:37

5

a #define只是在編譯之前進行文本替換。

#define STR "test1" 
sizeof(STR); 

實際上是由編譯器爲

sizeof("test1"); 

現在看到的這是什麼原因6,而不是5?因爲在字符串的末尾有一個空終止符。

1

什麼人說......

C,預處理標記不採取任何空間。這取決於你如何使用它們

#define STR "test1" 

char x[] = STR;   /* 6 bytes */ 
char *y = STR;   /* sizeof (char*) bytes (plus possibly 6 bytes) */ 
int ch = STR[3];  /* 1 byte (or sizeof (int), depending on how you look at it) */ 
if (ch == STR[1])  /* 1 byte (or sizeof (int) or no bytes or ...) */ 

printf("==>" STR "<==") /* 5 bytes ??? */ 
0

最新的C編譯器有一個功能,想,如果編寫程序的人處於學習階段,並給出答案,這使得他們搜索日益廣泛和深入,從而豐富自己的知識。

編程了一段時間後,這取決於你的學習,你可能會看到值下降到5 ;-)

JK ..因爲別人說,它象徵什麼都不具有諷刺意味需要結束字節。

1

爲什麼這需要6個字節?

實際上,它需要(6個字節×你使用它的次數),因爲它是一個預處理宏。

嘗試用const char *STR = "test1"代替。

+1

未指定相同的字符串文字是否是不同的對象。即表達式「test1」==「test1」'的值可能爲真或假。這甚至可以取決於編譯器設置。 – MSalters 2010-10-01 07:41:25

相關問題