C悬空指针问题

时间:2011-03-11 22:01:12

标签: c

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


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

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

5 个答案:

答案 0 :(得分:11)

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

在某些系统上,它可能会使您的应用程序崩溃,而在其他系统上,它可能会正常运行。但无论哪种方式,你都不应该这样做。

答案 1 :(得分:5)

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

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

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:4)

是。一般来说,你不想做的事情是劝阻,但如果你需要这样做,那就改为:

static char str[32];

这将确保它在函数退出后保持不变。

答案 4 :(得分:2)

YES! 它会返回指向“Hello there!”的指针。但是因为xyz()释放了那个内存你不能确定字符串是否仍然存在所以它会悬挂指针!