在堆栈中,我们为函数main调用堆栈帧保留了内存。main
当我们调用Add函数时,内存保留在栈顶。在Add函数堆栈帧中,a和b是本地指针,c是一个整数,它计算总和然后我们返回引用。c是Add函数的局部变量。
现在,当Add函数执行完成时,堆栈中的内存空间也被释放,所以当我们尝试在mainwith 指针中访问这个地址时p,我们试图访问的基本上是一个释放的空间。编译器发出警告,但为什么它仍然正确打印值 5?
答案可能是机器没有释放内存空间,因为它认为没有必要,因为没有更多的功能。但是如果我们编写另一个函数Hello,那么它肯定应该Add在调用堆栈中为函数释放空间,但程序仍然打印
Yay 5
是因为像在堆中一样,我们需要null在释放它之后分配一个指针,否则我们仍然可以访问它?这里有类似的东西吗?
/* void Hello()
{
printf("Yay");
} */
int* Add(int *a,int *b)
{
int c=*a+*b;
return &c;
}
int main()
{
int a=1,b=4;
int *p=Add(&a,&b);
// Hello();
printf("\t%d",*p);
return 0;
}