簡體   English   中英

在C中,我可以在指針聲明中初始化字符串,就像我可以在char數組聲明中初始化字符串一樣嗎?

[英]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個區域(段):

  • 代碼段:程序的文本存儲在這里(它是一個只讀區域)
  • 數據段:包含具有預定義值且可以修改的任何全局或靜態變量
  • stack segment:這里加載函數,因為它們被調用。 每個函數調用在堆棧上推送的值集(堆棧幀),其中包含函數和局部變量的返回地址。

在你的情況下, s[]變量是main()函數中的局部變量(數組),它使用值"string"初始化。 因此,它存儲在堆棧中並且可以被修改。

*s變量是一個指向"string\\0"地址的指針,這是一個位於代碼段中的常量。 作為只讀區域,您無法修改其內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM