在栈中,为
当我们调用
现在,当
答案可能是,机器认为不需要释放内存空间,因为没有更多的函数。但如果我们写另一个函数
main
保留内存,我们称之为main
函数的堆栈帧。当我们调用
Add
函数时,在堆栈顶部保留内存。在Add
函数的堆栈帧中,a
和b
是局部指针,c
是一个整数,它计算总和,然后我们返回引用。 c
是Add
函数的局部变量。现在,当
Add
函数执行完成后,堆栈中的内存空间也被释放,因此当我们尝试使用指针p
在main
中访问此地址时,我们尝试访问的基本上是已释放的空间。编译器会发出警告,但为什么它仍然正确打印值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;
}
c
是什么?int c
是什么意思? - Sourav GhoshHello()
函数比Add()
函数更小。 - Iharob Al Asimi