2016-07-28 55 views
0

我知道,在C字符串賦值必須經過char array [] =「string」的底層機制是什麼?

char string[4]; 
strcpy(string, "aaa"); 

但爲什麼以及如何ç允許

char string[] = "string"; 

在此先感謝

+1

C從來沒有(也永遠不會?)本地的字符串類型。以'\ 0'結尾的字符序列被認爲是一個字符串。 – sjsam

+4

http://stackoverflow.com/questions/1704407/what-is-the-difference-between-char-s-and-char-s-in-c –

+1

@ P.P。不完全一樣 - 這是'char string [4]'和'char string []'之間的區別,而另一個在'char string []'和'char * string'之間。 – skyking

回答

2

您似乎誤解了一些東西。根據GCC你允許這樣做:

char string[4] = "aaa"; 

char string[] = "aaa";的區別僅僅是編譯器推斷的string長度由它的初始化。這裏沒有什麼區別於其他類型的數組 - 僅僅是您可以將字符串文字用作初始值設定項而不是數組文本。

+0

我給字符數組賦值了一個字符串char string [] =「aaa」,但我可以之後更改內容。沒有錯誤。 – hemel

+0

@FabioTurati我刪除了該段,以便您對我的最後一段的評論僅適用於不再存在的段落... – skyking

2
char string[] = "string"; 

這裏,string長度,以便有足夠的空間用於字符串和NUL字符由編譯器自動計算。

char string[4]; 
strcpy(string, "aaa"); 

這裏strcpy可以訪問超出數組邊界如果字符串是比實際string容量。

+0

如果strcpy可以超出數組邊界,那麼這是否意味着它會根據大小爲數組分配內存地址的字符串? – hemel

+1

不,它只是繼續寫入下面的內存地址,被其他變量佔用,產生未定義的結果。這種技術用於緩衝區溢出攻擊,所以如果你正在從用戶給出的字符串中執行strcpy,你必須首先檢查目標緩衝區的大小是否足夠大。 – AwkMan

+0

@hemel:不,它不調整數組大小(你說什麼):這是你的工作。這只是寫入數組的邊界,導致UB。 – edmz