0
我有通過引用傳遞一個將爲pid_t作爲一個空指針,和類型轉換回一個將爲pid_t的問題。我的代碼如下:void指針類型轉換到不正確地將爲pid_t
typedef void * ProcessHandle_t;
void createProcess(ProcessHandle_t * processHandle)
{
pid_t newTask = fork();
if(newTask != 0)
{
/* Parent process */
/* Return a process handle for the main task to use */
*processHandle = &newTask;
printf("pid_t output 1: %d\n", *((pid_t *)*processHandle));
} else
{
while(1){
printf("Child running\n");
}
}
}
void deleteProcess(ProcessHandle_t processHandle)
{
pid_t deleteTask = *((pid_t *)processHandle);
printf("pid_t output 3: %d\n", deleteTask));
kill(deleteTask, SIGKILL);
}
int main()
{
ProcessHandle_t processHandle;
createProcess(&processHandle);
printf("pid_t output 2: %d\n", ((pid_t *)*processHandle));
deleteProcess(processHandle);
printf("Parent exiting\n");
}
而且我的輸出是:
pid_t output 1: 19876
pid_t output 2: 19876
pid_t output 3: 493972479
Parent exiting
但我不知道爲什麼。如果我用int進行同樣的解引用,它可以工作,但是當我對pid_t執行相同操作時,我會得到一個非常奇怪的值。
有,爲什麼這並不將爲pid_t工作具體原因,但與其他變量類型的作品?
不是一個真正的回答你的問題,但這些類型的頭痛正是爲什麼你不應該隱藏背後的typedef指針語義。如果你的「抽象」開始破壞你的代碼,這是一個糟糕的抽象。 – StoryTeller
在deleteProcess中不應該有*((pid_t *)processHandle)''(pid_t)processHandle'? – DyZ
如果你要添加typedef的麻煩,爲什麼不'typedef ptr_t * ProcessHandle_t;'?這可以說是更清晰和更易於維護。或者甚至更好,忘記typedef並忘記間接...並且按原樣使用最初的'ptr_t'! – paulsm4