2011-04-23 38 views
0
gcc (GCC) 4.6.0 20110419 (Red Hat 4.6.0-5) 

我剛剛使用了sigaction,並且在將信號hanlder函數分配給sa_handler時我得到了堆棧轉儲。將sigaction聲明爲值類型的指針類型

這是我做過什麼用指針類型:

struct sigaction *new_act = NULL; 

new_act->sa_handler = signal_handler; /* This line produces the stack dump */ 

sigaction(SIGINT, new_act, NULL); 

這是我沒有使用值類型:

struct sigaction new_act; 

new_act.sa_handler = signal_handler; /* No problem here */ 

sigaction(SIGINT, &new_act, NULL); 

有什麼用指針類型的值類型的區別?

非常感謝您的任何建議,

回答

2
struct sigaction *new_act = NULL; 

這將創建類型指針的變量struct sigaction。它根本不創建struct sigaction。沒有內存分配給該結構的字段,只是足以存儲這樣一個結構的地址。

如果你想使用一個指針,你需要使用malloc例如結構自己分配內存:

struct sigaction *new_act = malloc(sizeof(struct sigaction)); 

並記住free它不再被使用時。

代碼的第二個版本正確地創建了一個struct sigaction類型的對象,因此您可以直接與它進行交互。

1

這裏的錯誤是程序員新手指針之間真正常見的誤解。如果我沒有弄錯,你已經根據sigaction函數帶有指針參數的事實創建了一個指針類型的變量。但整個論點的觀點是指向,即包含信號處理信息的結構。將參數傳遞給函數時,只需要一個表達式,其類型與函數參數類型兼容,但不一定是該類型的變量。例如,一些初學者可能傾向於寫:

struct sigaction new_act; 
struct sigaction *new_act_ptr = &new_act; 
/* ... fill in new_act here ... */ 
sigaction(SIGINT, new_act_ptr, NULL); 

但是這裏的指針變量是完全沒用的。表達&new_act本身已經有正確的類型,所以你可以這樣做:

struct sigaction new_act; 
/* ... fill in new_act here ... */ 
sigaction(SIGINT, &new_act, NULL);