Stack&中的变量堆

时间:2014-10-14 19:43:48

标签: c stack heap-memory

在本文中所写内容的背景下

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)可以被其他函数访问,因为它们在堆中,正如文章所说。 但是如果我们创建一个指向堆栈中的局部变量的指针,并返回该指针,那么该变量也可以在其他函数中访问。

2 个答案:

答案 0 :(得分:3)

通过返回局部变量的地址(并尝试在调用者中取消引用它),程序将调用未定义的行为。未定义行为的一个可能结果是您的程序似乎正常工作。但是,如果您在调用funcprintf之间更改代码以调用另一个函数(尤其是创建和设置局部变量的函数),那么您可能会得到不同的结果。< / p>

a过去占用的内存单元 1 显然仍然存在,并且将包含a的最后一个值,直到其他东西覆盖它为止。你刚刚接触到它之前就碰巧访问了那个内存单元。

<小时/> 1。我们在这里讨论虚拟内存,而不是物理内存。

答案 1 :(得分:1)

您正在返回该地址,并且它看起来是正确的,因为没有任何内容可以替换该位置的内存内容。这不能保证是这种情况。如果你在func和printf之间调用一个函数,那么你可能会得到不同的结果

相关问题