int main[-1U] = {1};
非常简单。编译它
gcc foo.c
不会生成任何文件(至少当我在后台挂起 GCC gcc & :
时,我无法使用 lsof
找到它),但是 16 GiB 的 < strong>二级存储(硬盘)会被吃掉。
这是如何工作的?
最佳答案
你可以用一个简单的 printf
来解开这个谜团:
printf("%zu\n", (size_t)-1U);
这会产生 4294967295
( demo ) - 足以在 sizeof(int)
等于 4
的系统上填充 16Gb 内存.
要了解为什么这会在文件系统中占用如此多的空间,请将 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
__data
段包含初始化数据。编译器会填充它,因为您提供了 {1}
初始值设定项。如果省略它,磁盘上可执行文件的大小将缩小到几千字节,因为数组将被放入未初始化的段中:
$ size -A -d foo.o
foo.o :
section size addr
__text 0 0
Total 0
关于c - 编译这个程序如何填满我的电脑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47476071/