2017-03-07 82 views
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工作具體原因,但與其他變量類型的作品?

+2

不是一個真正的回答你的問題,但這些類型的頭痛正是爲什麼你不應該隱藏背後的typedef指針語義。如果你的「抽象」開始破壞你的代碼,這是一個糟糕的抽象。 – StoryTeller

+0

在deleteProcess中不應該有*((pid_t *)processHandle)''(pid_t)processHandle'? – DyZ

+3

如果你要添加typedef的麻煩,爲什麼不'typedef ptr_t * ProcessHandle_t;'?這可以說是更清晰和更易於維護。或者甚至更好,忘記typedef並忘記間接...並且按原樣使用最初的'ptr_t'! – paulsm4

回答

0

請記住,本地變量走出去的一次函數,他們在返回定義的範圍。

createProcess功能,您有

*processHandle = &newTask; 

在這裏你做出*processHandle指向局部變量newTask

createProcess已經返回時,先前由newTask變量佔用的內存不再「存在」(實際上它將被下一個函數調用重用),給您留下一個雜散指針。

取消引用此指針會導致未定義行爲

如果你要複製的newTask使用指針的內容,那麼你需要爲複製的價值分配內存,而實際上複製值到新分配的內存。如果你分配內存,那麼你當然也必須釋放它。

一個簡單的辦法是在所有不使用指針。避免指針通常是一種避免未定義的行爲和崩潰的好方法。

相關問題