char *xyz()
{
char str[32];
strcpy(str,"Hello there!");
return(str);
}
void main()
{
printf("%s",xyz());
}
当我调用xyz()时,是否会返回一个悬空指针? 感谢
答案 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()释放了那个内存你不能确定字符串是否仍然存在所以它会悬挂指针!