如何编译这个程序填满我的电脑?

iBu*_*Bug 3 c gcc

int main[-1U] = {1};
Run Code Online (Sandbox Code Playgroud)

这很简单.用它编译

gcc foo.c
Run Code Online (Sandbox Code Playgroud)

不会生成任何文件(至少我lsof在后台挂起GCC时无法找到它gcc & :),但是会丢失16 GiB的二级存储(硬盘驱动器).

这是如何运作的?

das*_*ght 7

你可以用一个简单的方法解决这个谜团printf:

printf("%zu\n", (size_t)-1U);
Run Code Online (Sandbox Code Playgroud)

这产生4294967295(演示) - 足以在sizeof(int)等于的系统上填充16Gb的内存4.

要了解为什么在文件系统中占用这么多空间,请编译foo到目标文件,然后运行size实用程序.

我修改了程序,将数组大小调整为1,000,000个元素.以下是您从运行中获得的输出size:

$ gcc -c foo.c
$ size -A -d foo.o
foo.o  :
section        size   addr
__text            0      0
__data      4000000      0
Total       4000000
Run Code Online (Sandbox Code Playgroud)

__data段包含初始化数据.编译器填充它,因为您提供了{1}初始化程序.如果省略它,磁盘上可执行文件的大小将缩小到几千字节,因为该数组将放入未初始化的段:

$ size -A -d foo.o
foo.o  :
section     size   addr
__text         0      0
Total          0
Run Code Online (Sandbox Code Playgroud)