如果控制返回到main()变量之后,如果从堆栈中删除了i仍然是5,因为我在main()中不存在并且指针指向的变量不是存在.
#include<stdio.h>
int* sum() {
int i=5;
int*a=&i;
printf("%d\n",a);
return a;
}
int main() {
int* a=sum();
printf("%d\n",a);
printf("%d",*a);
}
Run Code Online (Sandbox Code Playgroud)
输出:
2293252
2293252
5
Run Code Online (Sandbox Code Playgroud)
你看到的是未定义的行为.
将函数导致的局部变量的地址返回到未定义的行为.
因此,结果可能不会像所有平台上预期的那样.
int i=5;
Run Code Online (Sandbox Code Playgroud)
是一个局部变量,您返回此变量的地址.退出函数后,此变量不再有效,因此在其范围之外访问它是未定义的行为.不应从函数返回存储此局部变量的地址.或者你可以做
int* sum()
{
int*a = malloc(sizeof(int));
*a = 5;
printf("%d\n",*a);
return a;
}
Run Code Online (Sandbox Code Playgroud)
PS:printf("%p",(void*)a);应该用于打印指针,使用错误的格式说明符导致未定义的行为.