我是一個有點困惑這個表達式:C是否在堆棧上創建字符串文字?
char *s = "abc";
是否字符串文字得到棧上創建的?
我知道,這表達
char *s = (char *)malloc(10 * sizeof(char));
分配上的堆內存,這表達
char s[] = "abc";
在棧上分配內存,但我完全不能確定第一個表達式做什麼。
我是一個有點困惑這個表達式:C是否在堆棧上創建字符串文字?
char *s = "abc";
是否字符串文字得到棧上創建的?
我知道,這表達
char *s = (char *)malloc(10 * sizeof(char));
分配上的堆內存,這表達
char s[] = "abc";
在棧上分配內存,但我完全不能確定第一個表達式做什麼。
通常,字符串文字存儲在可執行文件的只讀部分。指針s
將在堆棧上創建(或放置在一個寄存器中,或者只是優化掉) - 並指向那個位於「別處」的字符串字面值。
"abc"
字符串字面存儲在__TEXT,__cstring
(或rodata
或任何依賴於對象格式)如果啓用字符串池程序的部分。這意味着,它既不在堆棧中,也不在堆中,而是粘在代碼附近的只讀內存區域中。
char *s = "abc";
本聲明將分配字符串文字到s
的存儲位置,即s
點到只讀存儲器區域。
「堆棧」和「堆」是實現細節並取決於平臺(全世界都是而不是 x86)。從語言POV來看,重要的是存儲類別和範圍。
字符串文字有靜態程度;在程序啓動時分配它們的存儲空間,直到程序終止。它也假定字符串文字不能被修改(試圖這樣做調用未定義的行爲)。將其與本地的塊範圍(自動)變量進行對比,這些變量的存儲在塊輸入時分配並在塊出口處釋放。通常,這意味着字符串文字不會存儲在與塊範圍變量相同的內存中。
注意,即使s是char *而不是char const,也不能修改字符串「abc」。 – AProgrammer 2010-02-15 15:21:31
實際上,使用char *來引用只讀常量被認爲已被棄用。還有一個編譯器警告它。新軟件應該使用const char * – Thorsten79 2010-02-15 15:53:03
除了「只讀部分可執行文件」之外,還有其他可執行文件嗎?也許「只讀存儲器」不那麼令人困惑。 – alexkr 2010-02-15 16:04:01