連結器與載入器與執行檔格式

執行C語言的「char *p = "hello"; p[0] = 'H';」時,在許多環境中會異常終止。下列關於其原因的敘述何者正確?

  1. A因為字串放在堆疊上,函式返回後就消失了
  2. B因為字串常值放在禁止寫入的.rodata中,卻試圖對其寫入
  3. C因為p被初始化為0
查看答案與解析

正確答案:B. 因為字串常值放在禁止寫入的.rodata中,卻試圖對其寫入

像"hello"這樣的字串常值,以及加上const的全域常數,會放在唯讀的資料區域(.rodata)。這個分頁禁止寫入,因此一旦試圖寫入,CPU會偵測到保護違規,作業系統便會停止該程式(區段錯誤,segmentation fault)。若想改寫,只要改成陣列「char s[] = "hello";」,就會在可寫入的區域建立一份副本。

  • A. 字串常值在程式執行期間會一直存在。
  • B. 正確。寫入時會發生保護違規。
  • C. p指向字串的開頭。
練習這個領域 前往領域頁面

連結器與載入器與執行檔格式的其他題目

  1. 下列全域變數中,一般會放在.bss區段的組合為何?
  2. 在C語言的函式中宣告、未加static的區域變數(自動變數),執行時會放在哪裡?
  3. 以C語言的malloc配置的記憶體,一般是從行程的哪個區域取得?
  4. 將Linux等一般行程的記憶體配置,由位址小的一側依序排列,下列何者正確?
  5. 將行程的堆積與堆疊配置成中間隔著寬廣的空閒區域、朝相反方向延伸,其優點為下列何者?

這個領域的比較