第1个回答 2021-04-14
局部变量是存放在栈中,还是存放在堆栈中?局部变量存放在栈中。
程序运行中有两个存储空间可用,一个是栈,是归属于进程本身的,另外一个是堆,所有进程共用的。
局部变量在声明周期为函数内部,其存储空间位于栈中。当进入函数时,会对根据局部变量需求,在栈上申请一段内存空间,供局部变量使用。当局部变量生命周期结束后,在栈上释放。
由于进程的栈空间是有限的,所以要避免申请占用空间过大的局部变量,以及避免函数嵌套层数过多。这些都可能引起栈空间不够导致程序崩溃。程序中的局部变量存放在栈中,因而不能太大,如:
double a[1000][1000];就可能不能通过编译。用户动态分配的内存,分配于堆中,可以很大。如
double **a = new double *[1000];
for(int i = 0; i < 1000; ++i)
a[i] = new double [1000];
第2个回答 推荐于2017-09-10
程序中的局部变量存放在栈中,因而不能太大,如:
double a[1000][1000];就可能不能通过编译。用户动态分配的内存,分配于堆中,可以很大。如
double **a = new double *[1000];
for(int i = 0; i < 1000; ++i)
a[i] = new double [1000];本回答被提问者采纳
第3个回答 2021-04-14
我觉得你这是把数据结构中的栈和内存中的栈混为一谈了
内存中的堆栈也是栈,但是这个堆栈是可以用内存地址去访问其中的数据的,并不是只能用push pop操作
当然,堆栈中压栈和出栈操作仍然是push、pop,但是这两个操作你可以想成插入、删除,一旦pop后这个数据就"消失"了
所以你的printf访问的b并不是pop方式取到的,而是通过地址拿到的
如果访问b使用pop方式取的话,那岂不是一个变量只能是一次性的使用了。。。
补上俩图 一个是VS2017写的源码 一个是编译好的exe使用IDA的反汇编语句
对照源码和反汇编 更好理解局部变量和栈的关系以及栈如何存储 如何释放
图是PC下截的,在PC看大图更舒服些
源码:
IDA反汇编扒出来的main函数
编辑于 2020-09-25 · 著作权归作者所有
展开阅读全文
赞同 3
评论
更多回答
xjfql
xjfql
c++ Qt
可以了解一下“栈帧”的概念。
这里a和b的空间其实是一起分配一起销毁的。分配和销毁的时候只要改变一下堆栈指针(ESP和EBP)就可以了。
可以这么理解,这里的栈是在函数开始时一下压一大块空间进去,包含了所有的局部变量所需的空间,函数结束后再一次性出栈,而不是以单个变量为单位进出栈的。
第4个回答 2006-12-19
问题说详细,就好回答