c语言main函数中的变量和其他函数中的变量使用的是一个堆栈吗

int *f1(void)
{
int x =10;
return(&x);
}
void f2()
{
int a=20;
}
void main()
{
int *a;
a=f1();
printf("%d\n",*a);
f2();
int y=30;
printf(“%d\n”,*a);
}
这个程序中,f1()中的x,f2()中的a和main中的y是分配在一个栈中吗? 我知道f1(),f2()中的x,a在函数结束时就会释放,我就是想知道他们分配的时候是怎么弄的。

    是一个栈,但不一定是一个堆。每次程序运行都会分配一个栈,main函数就在栈底,然后通过不同函数的调用顺序,依次进栈出栈。堆是程序动态分配的空间,每次分配的空间不一定是连续的。

    1) 在栈上创建。在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,一般使用寄存器来存取,效率很高,但是分配的内存容量有限。
    2) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete来释放内存。动态内存的生存期由程序员自己决定,使用非常灵活。

    编译器一般使用栈来存放函数的参数,局部变量等来实现函数调用。有时候函数有嵌套调用,这个时候栈中会有多个函数的信息,每个函数占用一个连续的区域。一个函数占用的区域被称作帧()。同时栈是线程独立的,每个线程都有自己的栈。一个线程只有一个栈,这个线程中执行的所有函数都会用这个栈。函数被调用的时候会在栈顶开辟一部分空间(实质上只是将栈顶上移)保存自己的数据,这些数据就包括函数的参数、返回地址、局部变量。函数返回的时候只要把栈顶回复到被调用前的状态就把它占用的空间释放了。

    例如下面简单的函数调用:

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-06-03
不是的. 每一个函数就是一个堆栈. 每调用一次, 都会有指针指向它. 而变量是加在这些堆栈中的(C语言一般是在堆栈的栈顶, C++都是哪用到在哪)
学高级语言的这些一般是不用在意的, 只有学汇编才用管它.
但是全局变量是共用一个堆栈的.
第2个回答  推荐于2016-01-11
C语言每调用一次子函数都会为子函数新分配一片空间。先调用f1(),那么在mai()函数之外开辟了一块空间用来执行子函数,其中为变量x也分配了一个整形大小的空间,a=f1()之后,x的地址被赋值给a,也就是说a所指向的地址里面存放的是10;f1()的空间释放之后,调用f2(),又在将原来分配给f1()的空间分配给f2(),或者说这两个函数的起始地址相同,而这两个函数中的赋值语句又在相同的地址偏移的地方,所以在语句a=20之后,主函数中的a所指向地址的内容又变为了20。如果把f2()中的第一条语句换成其它的,那么最后的结果又不一样了。也就是说编译器会在固定的地址开始为子函数分配空间。而变量y所在的空间与a所指向的地址空间不一样,所以不会改变a指向的内容。本回答被提问者采纳
第3个回答  2012-03-19
一个线程只有一个栈,这个线程中执行的所有函数都会用这个栈。函数被调用的时候会在栈顶开辟一部分空间(实质上只是将栈顶上移)保存自己的数据,这些数据就包括函数的参数、返回地址、局部变量。函数返回的时候只要把栈顶回复到被调用前的状态就把它占用的空间释放了。追问

像我写的那个函数,运算结果是10 20,为什么不是10 30呢? f2()里的int a=20覆盖了原来的10,那为什么main函数里int y=30没有覆盖20呢?

c语言main函数中的变量和其他函数中的变量使用的是一个堆栈吗
不是的.每一个函数就是一个堆栈.每调用一次,都会有指针指向它.而变量是加在这些堆栈中的(C语言一般是在堆栈的栈顶,C++都是哪用到在哪)学高级语言的这些一般是不用在意的,只有学汇编才用管它.但是全局变量是共用一个堆栈的.

main函数里的变量是在堆栈上么
不是的. 每一个函数就是一个堆栈. 每调用一次, 都会有指针指向它. 而变量是加在这些堆栈中的(C语言一般是在堆栈的栈顶, C++都是哪用到在哪) 学高级语言的这些一般是不用在意的, 只有学汇编才用管它. 但是全局变量是共用一个堆栈的.

c语言中的堆栈区变量区和汇编学的堆栈段代码段的区别
一个由C\/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap)一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类...

C地址问题
这是操作系统的内存管理问题,一个程序一运行,操作系统就会给这个程序分配好一块连续的内存,而你在main函数中的3个变量是连续定义的,因此内存地址也是连续的,如果内存地址是随机分配,那么有可能会将内存指向另外一个程序的内存中,会造成比较严重的后果~~...

C语言堆栈问题,数组作为函数参数到底是占用堆空间还是栈空间啊_百度...
你这个函数只传了一个数组的地址,说白了就是一个unsigned long int数,就一个这样的数你觉得用得着去动用栈栈传参吗?X86随便一个寄存器都能装得下,一般AX,BX,CX,DX这几个寄存器对于这种传几个字长的参数够够的了,只有在寄存器不够的情况下,参数过多,或参数过大(结构体)才用得着堆栈传...

C语言的堆栈和单片机里的堆栈的联系和区别
注意静态变量是不入栈的。 当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。关于存储内容还可以参考这道题。这道题还涉及到局部变量的存活期。5....

c语言中堆和栈的区别
栈(操作系统):由操作系统自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。堆(操作系统):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。堆栈缓存方式区别:栈使用的是一级缓存,他们通常都是被调用时处于存储空间中,...

C语言中,把变量定义在主函数之外和定义在主函数之内有什么区别_百度知 ...
最后的值是100.在函数体之内的i和函数体之外的i是存放在两个内存位置的,在内部能够看到的是内部生存期的。建议你去看下变量在函数的生存期和内存中的位置,会有更深刻的理解。

谁能帮我说下C语言中的堆栈
要讲C语言的堆栈,要从计算机的数据内存分配讲起.___| Stack区(数组,指针,结构体,局部变量)___| Static变量(静态变量,全局变量)___| Heep区(堆区)___| 代码段 ___从上面示意图中可看出整个内存分配,堆分配是在内存中按块划分,也就是相对与函数malloc,realloc,calloc.这...

C语言中函数返回什么类型的变量哪些可以是临时,哪些必须是静态或...
简单来说,临时变量就是不需要跨函数、跨线程和进程的时候使用,作用范围比较小,但是使用频率最高,不需要考虑多线程安全 静态变量可以在函数内定义,但是共用的,可以被更改和调用,程序不死则一直存在 全局变量与静态变量类似,但是要定义在所有函数以外,需要小心被多线程更改 我语言有点杂乱,看一下...

相似回答