使用linux編譯執行c程式,假如定義乙個區域性變數,是程式執行中由作業系統開闢的空間呢?還是編譯過程?

時間 2021-06-04 04:10:26

1樓:唐浩然

編譯器是「規劃書」,規劃『』計畫使用量『』,

作業系統是倉庫管理員,管『』具體分配多少量『』,「是否一次性完全分配」或「只分配當前所需」

2樓:

區域性變數在棧裡

只有函式呼叫的時候會分配棧空間,函式反回的時候吐出來這個應該是c規範來約束的,找本c語言的書認真看看。

編譯器只是c spec的執行者

3樓:雲天明

woc讀錯題了,然而我確實記得你寫的是全域性變數啊……

區域性變數感覺輪子哥說得有點問題……

區域性變數是在棧中分配的,所以叫棧幀,分配記憶體的彙編指令是add rsp, imm,這個是在變數定義的那一句發生的。如果在之後訪問變數(賦值/物件初始化中給成員變數賦值)的過程中因為棧生長到了沒有初始化過的頁面從而觸發page fault,那麼這個時候os會給這個程式初始化乙個page用。所以是,分配空間是函式直接做的,但是os幫助這個程式初始化了棧所在的位址空間。

不過確實棧所在的頁是執行緒啟動之前就初始化好的,但是如果棧超過事先初始化好的範圍發生了page fault,那輪子哥說得就不對了啊。

========全域性變數的分割線========

準確的說這段記憶體必須在映象被載入記憶體時由映象引導程式保留的,畢竟整個映象都是從硬碟載入的所以不可能說記憶體記憶體空間是編譯器分配的。

當然,如果這個變數有非0值的話,編譯器會在映象中記錄這個值,如果變數為0那麼編譯器會記錄這個變數被分配的空間大小。

FreeBSD下可以執行linux程式嗎?

用了FreeBSD很久了,基本上沒用過所謂的Linux相容。很好奇,到底什麼叫Linux程式?Vim算Linux程式嗎?難道Vim直接使用Linux核心的系統呼叫?Firefox算Linux程式嗎?Firefox直接使用Linux核心的系統呼叫?Linux程式到底是個什麼概念? 來亨金 有些很好用的...

C標準庫和Linux系統glibc C執行庫 的關係

C 標準主要由兩部分組成,一部分描述C的語法,另一部分描述C標準庫。C標準庫定義了一組標準標頭檔案,每個標頭檔案中包含一些相關的函式 變數 型別宣告和巨集定義。要在乙個平台上支援C語言,不僅要實現C編譯器,還要實現C標準庫,這樣的實現才算符合C標準。不符合C標準的實現也是存在的,例如很多微控制器的C...

Linux上程式執行一段時間後,段錯誤,bt得其呼叫棧,函式A呼叫的下層函式棧損壞。我進入A函式棧楨,檢視eip,ebp暫存器,結合彙編分析,各項值都正確,實在是沒法了,還求各位大神指點一下?

brooks 如果問題是畢現的,就非常容易解決。你這裡是段錯誤,不是棧溢位。一般只有深層遞迴或者大的區域性變數才會有棧溢位。根據你的描述,eip被踩掉的可能比較大。另外sigsegv時,檢視寫入的非法位址和寫入的值是什麼也很關鍵。其他的一些建議,可以參考一下 1.所有的編譯警告都開啟。2.檢查一下c...