連結器與載入器與執行檔格式
執行C語言的「char *p = "hello"; p[0] = 'H';」時,在許多環境中會異常終止。下列關於其原因的敘述何者正確?
- A因為字串放在堆疊上,函式返回後就消失了
- B因為字串常值放在禁止寫入的.rodata中,卻試圖對其寫入
- C因為p被初始化為0
查看答案與解析
正確答案:B. 因為字串常值放在禁止寫入的.rodata中,卻試圖對其寫入
像"hello"這樣的字串常值,以及加上const的全域常數,會放在唯讀的資料區域(.rodata)。這個分頁禁止寫入,因此一旦試圖寫入,CPU會偵測到保護違規,作業系統便會停止該程式(區段錯誤,segmentation fault)。若想改寫,只要改成陣列「char s[] = "hello";」,就會在可寫入的區域建立一份副本。
- A. 字串常值在程式執行期間會一直存在。
- B. 正確。寫入時會發生保護違規。
- C. p指向字串的開頭。