gpt4 book ai didi

c - 无效指针类型转换为 pid_t 不正确

转载 作者:太空宇宙 更新时间:2023-11-04 12:33:31 25 4
gpt4 key购买 nike

我在通过引用将 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的内容,那么你需要为复制的值分配内存,实际上复制值到新分配的内存中.如果您分配内存,那么您当然也必须释放它。

一个更简单的解决方案是根本不使用指针。避免指针通常是避免未定义行为和一般崩溃的好方法。

关于c - 无效指针类型转换为 pid_t 不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42642102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com