char *xyz()
{
char str[32];
strcpy(str,"Hello there!");
return(str);
}
void main()
{
printf("%s",xyz());
}
当我调用xyz()函数时,它会返回一个悬空指针吗? 谢谢。
char *xyz()
{
char str[32];
strcpy(str,"Hello there!");
return(str);
}
void main()
{
printf("%s",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];
这将确保它在函数退出后仍然存在。
是的!它将返回指向“Hello there!”的指针,但由于xyz()释放了该内存,您不能确定字符串是否仍然存在,因此它将是悬空指针!