[英]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.