目的: 檢驗學員對前 3 週課程的認知
3
以下程式碼編譯並執行後,在 x86_64 GNU/Linux 會遇到記憶體存取錯誤:
$ cat ptr.c
int main() {
int *ptr = 0;
return *ptr;
}
$ gcc -o ptr ptr.c
$ ./ptr
Segmentation fault: 11
分別考慮以下 4 個程式,探討其行為。
ptr1.c
int main() { return *((int *) 0); }
ptr2.c
int main() { return &*((int *) 0); }
ptr3.c
#include <stddef.h>
int main() { return &*NULL; }
ptr4.c
#include <stddef.h>
int main() {
return &*(*main - (ptrdiff_t) **main);
}
作答區
K1 = ?
(a)
ptr1.c
在執行時期會造成 Segmentation fault(b)
對於 ptr1.c
, C 語言規格書聲明這是 undefined behavior 或者語法錯誤(c)
ptr1.c
是合法 C 程式,在執行後可透過 echo $?
得到 exit code 為 0
K2 = ?
(a)
ptr2.c
在執行時期會造成 Segmentation fault(b)
對於 ptr2.c
, C 語言規格書聲明這是 undefined behavior 或者語法錯誤(c)
ptr2.c
是合法 C 程式,在執行後可透過 echo $?
得到 exit code 為 0
K3 = ?
(a)
ptr3.c
在執行時期會造成 Segmentation fault(b)
對於 ptr3.c
, C 語言規格書聲明這是 undefined behavior 或者語法錯誤(c)
ptr3.c
是合法 C 程式,在執行後可透過 echo $?
得到 exit code 為 0
K4 = ?
(a)
ptr4.c
在執行時期會造成 Segmentation fault(b)
對於 ptr4.c
, C 語言規格書聲明這是 undefined behavior 或者語法錯誤(c)
ptr4.c
是合法 C 程式,在執行後可透過 echo $?
得到 exit code 為 0
延伸問題:
Segmentation fault
的訊息是如何顯示出來,請以 GNU/Linux 為例解說。提示: Page fault handler