在堆栈中,我们为函数main
调用堆栈帧保留了内存。main
当我们调用Add
函数时,内存保留在栈顶。在Add
函数堆栈帧中,a
和b
是本地指针,c
是一个整数,它计算总和然后我们返回引用。c
是Add
函数的局部变量。
现在,当Add
函数执行完成时,堆栈中的内存空间也被释放,所以当我们尝试在main
with 指针中访问这个地址时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;
}