C悬空指针问题

Jos*_*son 5 c

char *xyz()
{
   char str[32];
   strcpy(str,"Hello there!");
   return(str);
}


void main()
{
  printf("%s",xyz());
}
Run Code Online (Sandbox Code Playgroud)

当我调用xyz()时,是否会返回一个悬空指针?谢谢

Mar*_*ers 11

是的,这是一个悬垂的指针.您的程序调用未定义的行为.

在某些系统上,它可能会使您的应用程序崩溃,而在其他系统上它可能会正常运行 但不管怎样,你不应该这样做.


Lor*_*nVS 5

是的,它会产生悬空指针错误.

当你调用xyz()时,32*sizeof(char)字节将在xyz的堆栈帧中的堆栈上分配.当您在xyz()中工作时,您正在修改并处理已在堆栈上分配的这些字节.

return(str)调用使用str数组名作为指针,因此实际上是将地址返回到str数组.返回后,xyz的堆栈帧被展开,xyz对str的本地内存位置不再有效.

回到main函数中,xyz()的返回值(xyz堆栈帧中旧的str局部变量的地址)现在传递给另一个函数printf.当printf生成它自己的堆栈帧时,它实际上会写入以前用于在xyz()中存储str的内存(因为这是堆栈中的下一个可用内存).