2015-11-26 25 views
4

我很困惑,因爲從我所瞭解到的,指針存儲他們指向的數據的地址。但是在一些代碼中,我會看到在初始化過程中經常分配給指針的字符串。在初始化過程中指針被分配了字符串值時究竟發生了什麼?

字符串究竟發生了什麼?
指針是否自動分配一個地址來存儲字符串並將自己指向該地址?
「取消引用」如何在指向字符串的指針中起作用?

回答

4

問:我經常看到初始化過程中分配給指針字符串。

我想,你在呼喚什麼作爲實際上是一個字符串文字

根據C11標準,章§6.4.5

字符串文字是封閉在 雙引號零個或多個多字節字符的序列,如在"xyz"。 [...]

的表示,"xyz"產生字符串文字的第一元件,然後將其存儲到指針,因爲你已經在初始化的時候看到的地址。

問:指針是否自動分配一個地址來存儲字符串並將自己指向該地址?

答:不,編譯器在編譯時分配存儲字符串文字的內存。字符串文字是存儲在只讀存儲器還是讀寫存儲器中,都依賴於編譯器。標準僅提到任何修改字符串文字的嘗試都會導致undefined behavior

問:「取消引用」如何在指向字符串的指針中工作?

答:就像在另一個指向任何其他變量的指針的情況下一樣。

8

char *p = "String"; 

編譯器的情況下,分配內存"String",最有可能被"String"存儲在存儲器read only data部,並設置指針p到指向該存儲器地址的第一個字節。

p --------------+ 
       | 
       | 
       V 
      +------+------+------+------+------+------+------+ 
      |  |  |  |  |  |  |  | 
      | 'S' | 't' | 'r' | 'i' | 'n' | 'g' | '\0' | 
      |  |  |  |  |  |  |  | 
      +------+------+------+------+------+------+------+ 
       x100 x101 x102 x103 x104 x105 x106 
+0

我想你也應該更新答案,在這種情況下如何存儲一個'\ 0'來標記字符串的結尾以及所有函數在內部如何使用它來打印和使用字符串。 –

+1

@Krishna_Oza這有什麼相關的?問題是關於字符串文字的分配和指向它們的指針。 – Lundin

+1

先生,'字符串存儲在只讀數據部分'.....標準中指定的任何東西? –