C 悬空指针问题

C 悬空指针问题,c,C,当我调用xyz()时,它是否会返回一个悬空指针? 谢谢是的,这是一个悬空的指针。您的程序调用未定义的行为 在某些系统上,它可能会使您的应用程序崩溃,在其他系统上,它可能会正常工作。但无论如何,您都不应该这样做。它确实会返回一个悬空指针。是的。通常情况下,您试图做的事情通常不被鼓励,但如果您需要这样做,请改为: char *xyz() { char str[32]; strcpy(str,"Hello there!"); return(str); } void main()

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

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


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

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

是的。通常情况下,您试图做的事情通常不被鼓励,但如果您需要这样做,请改为:

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


void main()
{
  printf("%s",xyz());
}
这将确保它在函数退出后仍然存在。

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

是,它将生成悬空指针错误

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

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


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

这不是一个通用的解决方案。
static char str[32];