[英]In C, can I initialize a string in a pointer declaration the same way I can initialize a string in a char array declaration?
這兩行代碼是否實現了相同的結果? 如果我在函數中有這些行,那么在兩種情況下字符串都存儲在堆棧中嗎? 除了不需要在第一行代碼中聲明空終止符之外,我是否應該使用一個而不是另一個?
char s[] = "string";
char* s = "string\0";
不,這兩行沒有達到相同的效果。
char s[] = "string"
產生一個7個字節的可修改數組,最初填充內容's' 't' 'r' 'i' 'n' 'g' '\\0'
(全部復制過來)在運行時從字符串文字)。
char *s = "string"
導致指向包含string-literal“string”的只讀內存的指針。
如果你想修改你的字符串的內容,那么第一個是唯一的方法。 如果您只需要對字符串的只讀訪問權限,那么第二個將稍微更快,因為不必復制字符串。
在這兩種情況下,都不需要在字符串文字中指定空終止符。 當遇到結束時,編譯器將為您處理“。
這兩者之間的區別:
char a[] = "string";
char* b = "string";
是一個實際上是堆棧上的靜態數組,而b是一個指向常量的指針。 您可以修改a的內容,但不能修改b的內容。
除了其他答案,我將嘗試解釋為什么你不能在程序流程后修改*s
變量。
從概念上講,當程序加載到內存中時,它有3個區域(段):
在你的情況下, s[]
變量是main()
函數中的局部變量(數組),它使用值"string"
初始化。 因此,它存儲在堆棧中並且可以被修改。
*s
變量是一個指向"string\\0"
地址的指針,這是一個位於代碼段中的常量。 作為只讀區域,您無法修改其內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.