char *xyz()
{
char str[32];
strcpy(str,"Hello there!");
return(str);
}
void main()
{
printf("%s",xyz());
}
Run Code Online (Sandbox Code Playgroud)
当我调用xyz()时,是否会返回一个悬空指针?谢谢
是的,它会产生悬空指针错误.
当你调用xyz()时,32*sizeof(char)字节将在xyz的堆栈帧中的堆栈上分配.当您在xyz()中工作时,您正在修改并处理已在堆栈上分配的这些字节.
return(str)调用使用str数组名作为指针,因此实际上是将地址返回到str数组.返回后,xyz的堆栈帧被展开,xyz对str的本地内存位置不再有效.
回到main函数中,xyz()的返回值(xyz堆栈帧中旧的str局部变量的地址)现在传递给另一个函数printf.当printf生成它自己的堆栈帧时,它实际上会写入以前用于在xyz()中存储str的内存(因为这是堆栈中的下一个可用内存).