2013-03-29 59 views
1

我有一個關於如何編譯店C字符串的問題下面是一些代碼片段:編譯器如何存儲C字符串?

#define STRING_MACRO "macro" 
const char * string_const = "w"; 

int main(void){ 
    printf("%u\n", sizeof(STRING_MACRO)); 
    printf("%u\n", sizeof(string_const)); 

    return 0; 
} 

輸出:

4 - 我的系統是x86的,所以它是4

所以我對編譯器如何存儲C字符串感到困惑?宏樣式和值風格是一樣的嗎?

我想大多數人誤解我的問題。所以我自己嘗試了另一個代碼。

#define TEST "a" 

int main(void) 
{ 
    char hello[] = "aa"; 
    char (*a)[10] = &hello; 

    printf("%u\n", sizeof(TEST)); 
    printf("%u\n", sizeof(hello)); 
    printf("%u\n", sizeof(*a)); 

    return 0; 
} 

輸出:

2 
3 
10 

所以我得到一個結論的宏風格的編譯器C字符串中的char []類型,不是char *類型。

+1

的多少誤解'sizeof'這是否使今天的基指針? –

+0

字符串常量的類型爲char [N](適合於'N'),所以是的,它是一個數組,而不是一個指針。 –

回答

0

在你的第二個代碼,

  • TEST不過是了一段代碼,即字面a。在預處理器階段,該名稱擴展爲實際代碼。
  • 所有字符串文字均以NULL結尾。這就是爲什麼,

sizeof("a") = 1 // the size of the character 'a' 
       + 1 // size of the '\0' character 
      ----- 
       = 2 

  • 「a」 和 「AA」 被存儲在存儲器的只讀部分(執行所定義的)。
  • hello被存儲在堆棧中並且它指向到存儲「aa」的存儲器的只讀部分。
  • 由於hello被聲明爲字符陣列(其大小是隱式3,因爲沒有明確地指定大小),sizeof(hello) =長度數組的長度=(「AA \ 0」)= 3
  • a是一個指針到一個長度爲10的字符數組。
  • sizeof(a)將是4(在你的x86系統中),因爲a是一個指針。
  • sizeof(*a) = 10,因爲*a是長度的字符陣列10
2

字符串"macro"被定義爲代碼中的宏而不是變量。

如果您使用gcc -E構建代碼,您將獲得預代碼。並在此代碼,你會發現,

printf("%u\n", sizeof(STRING_MACRO); 

被替換

printf("%u\n", sizeof("macro")); 

的prprocessor代碼是由編譯之前,你的compilator生成的代碼。在這段代碼中,編譯器用宏的內容替換源代碼中的宏。

而對於"w"是文字字符串,而string_const是指向該文字字符串的指針。 32位系統的指針大小爲4,64位系統的指針大小爲8。

+0

那麼是什麼類型的「宏」,是char []? – MYMNeo

+0

答案已更新。在你的代碼中寫入'sizeof(STRING_MACRO)'相當於寫入'sizeof(「macro」)'。一樣的。宏不可變。答案已更新 – MOHAMED

3
sizeof(STRING_MACRO); 

是由編譯器視爲:

sizeof("macro"); 

這給你字符串「宏」的大小,字符串存儲在定義只讀區域的實現。


const char * string_const = "w"; 

string_cost是指向一個字符串 「W」 的指針。

所以,

sizeof(string_const); 

給人的指針即const char *這是apprantly 4您的系統上的大小。

0

編譯器不存儲任何內容。它在解析過程中評估常量的大小。 STRING_MACRO的大小被評估爲字符串+終結符字符(\0)的長度。string_const的大小被評估爲指針的大小(因爲它就是這樣),而在你的系統上指針大小是4字節(對應於32位系統)。

2

sizeof()返回對象的內存大小。

#define STRING_MACRO "macro" 

這是6,因爲編譯器分配用於 '宏'(5)+ 6個字節(1)爲一個字符串結束

const char * string_const = "w"; 

這是4,因爲它是一個指針,而你在32位平臺上工作,因此指向char的指針爲4個字節。