C悬空指针问题

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


void main()
{
  printf("%s",xyz());
}

当我调用xyz()函数时,它会返回一个悬空指针吗? 谢谢。
5个回答

11

是的,这是一个悬空指针。您的程序会引发未定义的行为。

在某些系统上,它可能会导致应用程序崩溃,在其他系统上,它可能看起来工作正常。但无论如何,您都不应该这样做。


5

是的,它将生成一个悬空指针错误。

当您调用xyz()时,将在xyz的堆栈帧内分配32 * sizeof(char)字节的空间。当您在xyz()内部工作时,您正在修改和处理已在堆栈上分配的这些字节。

return(str)调用使用str数组名称作为指针,因此实际上返回的是str数组的地址。一旦您返回,xyz的堆栈帧被解除,xyz为str分配的本地内存位置将不再有效。

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


4

它确实会返回一个悬空指针。


4

是的。一般来说,通常不鼓励这样做,但如果你需要这样做,请改为:

static char str[32];

这将确保它在函数退出后仍然存在。


这不是一个真正的通用解决方案。 - Yann Ramin

2

是的!它将返回指向“Hello there!”的指针,但由于xyz()释放了该内存,您不能确定字符串是否仍然存在,因此它将是悬空指针!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接