在本文中所写内容的背景下
http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html#sec-6
理解堆栈的关键是当一个函数时的概念 退出,它的所有变量都从堆栈中弹出(因此 永远失去了)。因此,堆栈变量本质上是本地的。
因此,弹出了属于该函数的所有变量,除了可能返回给函数的值(或者可能为父函数重新分配?),或者它不是静态的。
但是这个特别的程序完全正常。
#include<stdio.h>
int* func()
{
int a=6;
int *b;
b=&a;
printf("in func - %d \n",*b);
return b;
}
void func2()
{
int a,c;
a=99;
c=2*a;
printf("in func 2 - %d \n",c);
}
void main()
{
int *b;
b=func();
func2();
printf("in main - %d",*b);
}
输出:
C:\Users\Shaurya\Desktop>gcc asw.c
C:\Users\Shaurya\Desktop>a
in func - 6
in func 2 - 198
in main - 6
C:\Users\Shaurya\Desktop>
我认为用户分配的变量(使用calloc,malloc,realloc)可以被其他函数访问,因为它们在堆中,正如文章所说。 但是如果我们创建一个指向堆栈中的局部变量的指针,并返回该指针,那么该变量也可以在其他函数中访问。
答案 0 :(得分:3)
通过返回局部变量的地址(并尝试在调用者中取消引用它),程序将调用未定义的行为。未定义行为的一个可能结果是您的程序似乎正常工作。但是,如果您在调用func
和printf
之间更改代码以调用另一个函数(尤其是创建和设置局部变量的函数),那么您可能会得到不同的结果。< / p>
a
过去占用的内存单元 1 显然仍然存在,并且将包含a
的最后一个值,直到其他东西覆盖它为止。你刚刚接触到它之前就碰巧访问了那个内存单元。
<小时/> 1。我们在这里讨论虚拟内存,而不是物理内存。
答案 1 :(得分:1)
您正在返回该地址,并且它看起来是正确的,因为没有任何内容可以替换该位置的内存内容。这不能保证是这种情况。如果你在func和printf之间调用一个函数,那么你可能会得到不同的结果