是的,它的行爲是未定義的。
s
未初始化,因此s[400]
充其量只是內存中的某個不確定位置。
編輯:
最後三個你的問題的段落很少或無關的兩行代碼,我們一直在討論。 s[400] = 'd';
的未定義與堆棧,堆,進程或其他任何內容幾乎沒有關係。 s
未初始化,因此它包含垃圾;它可能指向記憶中的任何地方,或無處。 s[400]
充其量是一個char對象,位於由存儲的垃圾地址指定的未定義位置之外的400個字節爲s
。
如果你明白,你可能還有問題。我建議發佈一個沒有代碼示例的新問題。
要部分回答一些你問:
你的程序可能不合法地試圖訪問,這不是它創建的對象的一部分的任何內存(通過與像char foo[1000];
對象定義或通過像char *ptr = malloc(1000);
這樣的分配)。在一個特定的實現中,可能是以外的任何聲明對象的一部分內存區域,您可以隨身攜帶,但沒有安全或便攜的方式來執行此操作 - 沒有理由。如果您需要訪問某些內存,請先分配它。
C語言本身甚至不指「堆疊」或「堆」;這些是實現細節。
不,通常不會在進程之間共享堆。通常,當程序結束時,操作系統會整齊地回收所有堆棧分配和堆分配的內存。 (C標準不說這個,因爲它只能勉強維持本身涉及您的程序的執行外面發生了什麼,但它在某些嵌入式系統也許幾乎普遍正確的除外。)
「未定義的行爲」不意味着你無法訪問它。這意味着如果你這樣做可能會發生任何事情。 –