我在通过引用将 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/