【发布时间】:2021-01-17 19:46:18
【问题描述】:
我试图了解在 C 程序中如何管理内存。我知道内存中有以下几个段:
- 初始化数据段
- BSS
- 堆栈
- 堆
- 代码
现在考虑以下程序:
#include <stdio.h>
int main(){
int arr[4] = {1,2,3,4};
int x = 10;
printf("Hello World!");
}
在上面的程序中,arr 和 x 都是在 main 函数中本地声明的。我认为这意味着它们都将在函数堆栈上分配空间。 但是,当我在 linux 上运行 size 命令时,我发现数组实际上是在数据段中分配空间的。
我在网上搜索过这个,但发现了相互矛盾的信息。一些答案说所有本地声明的变量都应该进入堆栈,而另一些答案则说数组应该进入堆。如果我使用 malloc 动态分配内存,我认为数组会进入堆,但在本例中并非如此。
【问题讨论】:
-
请注意,您的初始化程序
{1,2,3,4}将存储在数据部分的程序映像中。在运行时,如果您的程序甚至创建了数组变量(因为正如其他人所说,优化器可以删除任何无效的内容),它将在堆栈上为数组创建空间,然后将初始化程序复制到其中。或者,如果使用优化器,它可能会删除初始化程序并将其替换为内联寄存器集指令。
标签: c memory-management process