【发布时间】:2015-03-13 20:28:18
【问题描述】:
在堆栈中,内存是为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? -
我认为它必须是为了性能,内存被释放而不是归零,为什么会归零?有人对它为零感兴趣吗?如果您需要重用它,它只是可用,为什么不尝试使用相同的函数但将另一个变量地址传递给它,它可能会覆盖旧的,
Hello()函数小于Add()函数。跨度> -
是的,它应该是 int c 和 Add。我编辑了那部分..
-
"是不是因为像在堆中一样,我们需要在释放它之后分配一个指向 null 的指针,否则我们仍然可以访问它?" 更改存储在指针中的值有对您是否可以访问它指向/指向的对象没有任何影响。
标签: c++ c pointers memory-management dangling-pointer