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

2025-02-28 07:04:59
推荐回答(4个)
回答1:

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

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

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

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

回答2:

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

回答3:

C语言每调用一次子函数都会为子函数新分配一片空间。先调用f1(),那么在mai()函数之外开辟了一块空间用来执行子函数,其中为变量x也分配了一个整形大小的空间,a=f1()之后,x的地址被赋值给a,也就是说a所指向的地址里面存放的是10;f1()的空间释放之后,调用f2(),又在将原来分配给f1()的空间分配给f2(),或者说这两个函数的起始地址相同,而这两个函数中的赋值语句又在相同的地址偏移的地方,所以在语句a=20之后,主函数中的a所指向地址的内容又变为了20。如果把f2()中的第一条语句换成其它的,那么最后的结果又不一样了。也就是说编译器会在固定的地址开始为子函数分配空间。而变量y所在的空间与a所指向的地址空间不一样,所以不会改变a指向的内容。

回答4:

一个线程只有一个栈,这个线程中执行的所有函数都会用这个栈。函数被调用的时候会在栈顶开辟一部分空间(实质上只是将栈顶上移)保存自己的数据,这些数据就包括函数的参数、返回地址、局部变量。函数返回的时候只要把栈顶回复到被调用前的状态就把它占用的空间释放了。