【发布时间】:2014-12-09 17:35:48
【问题描述】:
根据本文所写的内容
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)可以被其他函数访问,因为它们在堆中,正如文章所说。 但是,如果我们创建一个指向堆栈中的局部变量的指针,并返回该指针,那么该变量也可以在其他函数中访问。
【问题讨论】:
-
从不。曾经。说。 “完全没问题”。
-
尝试在调用
func和printf之间调用另一个函数。 -
当某些东西从堆栈中弹出时,它不会被删除!但是堆栈已被释放,因此可以(并且将)在那些局部变量的位置写入其他内容。因此,您的示例有效,因为您在调用
func后没有调用任何其他函数,但这并不意味着可以保证 -
似乎不起作用。我应该尝试更大的功能吗?结果已作为编辑发布。
标签: c stack heap-memory