簡體   English   中英

無效指針類型轉換為pid_t錯誤

[英]void pointer typecasting to pid_t incorrectly

我在通過引用將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,但適用於其他變量類型?

請記住,一旦在函數中定義了局部變量,它們就會超出范圍。

createProcess函數中,

*processHandle = &newTask;

在這里,使*processHandle指向局部變量 newTask

返回createProcess后,先前由newTask變量占用的內存不再“存在”(實際上,它將在下一個函數調用中重新使用),從而使您留下了流浪指針。

取消引用此指針將導致未定義的行為

如果要使用指針復制newTask的內容,則需要為復制的值分配內存,然后將值實際復制到新分配的內存中。 而且,如果您分配內存,那么您當然也必須釋放它。

一個更簡單的解決方案是根本不使用指針。 通常,避免使用指針是避免未定義行為和崩潰的一種很好的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM