2010-02-15 65 views
4

我是一個有點困惑這個表達式:C是否在堆棧上創建字符串文字?

char *s = "abc"; 

是否字符串文字得到棧上創建的?

我知道,這表達

char *s = (char *)malloc(10 * sizeof(char)); 

分配上的堆內存,這表達

char s[] = "abc"; 

在棧上分配內存,但我完全不能確定第一個表達式做什麼。

回答

21

通常,字符串文字​​存儲在可執行文件的只讀部分。指針s將在堆棧上創建(或放置在一個寄存器中,或者只是優化掉) - 並指向那個位於「別處」的字符串字面值。

+1

注意,即使s是char *而不是char const,也不能修改字符串「abc」。 – AProgrammer 2010-02-15 15:21:31

+0

實際上,使用char *來引用只讀常量被認爲已被棄用。還有一個編譯器警告它。新軟件應該使用const char * – Thorsten79 2010-02-15 15:53:03

+0

除了「只讀部分可執行文件」之外,還有其他可執行文件嗎?也許「只讀存儲器」不那麼令人困惑。 – alexkr 2010-02-15 16:04:01

6
"abc" 

字符串字面存儲在__TEXT,__cstring(或rodata或任何依賴於對象格式)如果啓用字符串池程序的部分。這意味着,它既不在堆棧中,也不在堆中,而是粘在代碼附近的只讀內存區域中。

char *s = "abc"; 

本聲明將分配字符串文字​​到s的存儲位置,即s到只讀存儲器區域。

3

「堆棧」和「堆」是實現細節並取決於平臺(全世界都是而不是 x86)。從語言POV來看,重要的是存儲類別和範圍。

字符串文字有靜態程度;在程序啓動時分配它們的存儲空間,直到程序終止。它也假定字符串文字不能被修改(試圖這樣做調用未定義的行爲)。將其與本地的塊範圍(自動)變量進行對比,這些變量的存儲在塊輸入時分配並在塊出口處釋放。通常,這意味着字符串文字不會存儲在與塊範圍變量相同的內存中。

相關問題