2013-12-14 70 views
-1

我:函數中的常量字符串 - 它們在哪裏保存?

void func() 
{ 
    char *s; 
    strcpy(s,"bla bla"); 
} 

是 「喇嘛喇嘛」 的地方保存?它是否被認爲是「const char *」,即使我沒有定義它?

+1

你的程序調用未定義的行爲('s'中沒有空間來存放字符串),''bla bla「'可能存儲在某處,也可能不存在。它也可能使[惡魔從你的鼻子裏出來](http://www.catb.org/jargon/html/N/nasal-demons.html)。 – Kninnug

+3

@Kninnug:UB在哪裏?什麼讓你覺得'bla bla''沒有存儲?它是一個字符串文字,並且愉快地坐在進程的靜態數據部分。 – bitmask

+1

@bitmask複製到's'而's'是一個未初始化的指針是未定義的行爲。編譯器可能會選擇優化''bla bla'',因爲它不能去任何地方。 – Kninnug

回答

-2

"blah blah"存儲在堆棧上,就像在函數中聲明的任何其他自動變量或數組一樣。

施工

char s[] = "blah blah"; 

相當於

char s[] = {'b', 'l', 'a', 'h', ' ', 'b', 'l', 'a', 'h', '\0'}; 

並將其初始化數組。

您可以將字符數組視爲char * const,因爲它們的行爲幾乎與數組相同,但從技術上講,數組是數組,而數組是指針,指針是指針。 這不是,但是與const char *相同。 char * const表示指針不能修改,const char *表示內存不能通過該指針修改。

+2

我沒有downvote,但聲明''blah blah''存儲在堆棧上是不正確的。所有字符串文字都是具有靜態存儲持續時間的對象,這意味着它們不可能被「存儲在堆棧中」。它被「存儲在堆棧中」,但是「blah blah」(如果它作爲單獨的對象存在)存儲在靜態存儲器中。 – AnT

+2

我把這個問題看作一個[C]問題,而不是「某些編譯器可能做的」問題。在語言規範中沒有任何地方說字符串文字只有在指向它們時才存在。就語言而言,每個字符串文字都是靜態存儲器中的一個未命名的數組對象。至於優化器可能會做什麼決定......它對語言完全沒有任何影響。在任何情況下,文字都是a)靜態或b)優化出來的。在任何情況下,「存儲在堆棧中」都是正確的答案。 – AnT

+0

是的,我明顯同意,「blah blah」的意思是's'的內容,因爲沒有其他有用的字符串可供討論。 –

2

字符串文字是無名數組對象,它們存儲在靜態內存中,即存儲全局變量的相同內存。字符串文字永遠存在:它們在程序開始時存在,並且一直存在,直到程序結束(就像全局變量一樣)。

但請注意,在您的代碼示例中,它是"blah blah",它是字符串文字。但您的s只是一個局部變量,通過字符串文字初始化(通過複製數據)。您的s與其他任何本地變量具有相同的生命週期 - 只要控制權通過func,它就存在。

還請注意,C中的字符串文字不被視爲const chart *,因爲您似乎錯誤地認爲。 C語言中的"blah blah"的類型實際上是char [10]。陣列類型可衰減爲指針類型,但即使在這種情況下,它將是char *而不是const char *

相關問題