我遇到的问题是通过引用将pid_t作为void指针传递,然后将其类型转换回pid_t。我的代码如下:
public function update(UpdateRequest $request)
{
// your additional operations before save here
$redirect_location = parent::updateCrud($request);
// your additional operations after save here
// use $this->data['entry'] or $this->crud->entry
return $redirect_location;
}
我的输出是:
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执行相同操作时,我会得到一个非常奇怪的值。
是否有一个特定的原因,为什么这不适用于pid_t,但适用于其他变量类型?
答案 0 :(得分:0)
请记住,一旦定义的函数返回,局部变量就会超出范围。
在createProcess
功能中
*processHandle = &newTask;
在此,您*processHandle
指向本地变量 newTask
。
当createProcess
返回时,newTask
变量先前占用的内存不再“存在”(实际上它将被下一个函数调用重用),留下一个迷路指针。 / p>
取消引用此指针将导致未定义的行为!
如果要使用指针复制newTask
的内容,则需要为复制的值分配内存,并实际将值复制到新分配的内存中。如果你分配内存,那么你当然也必须释放它。
更简单的解决方案是根本不使用指针。避免指针通常是避免未定义行为和崩溃的一种非常好的方法。