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

标签 c gcc

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/

相关文章:

c - 使用 C 实现密码字段

c - 如何修复由 -Wconversion 引起的错误?

c - 未定义对 p_thread_create、p_thread_join 和 p_thread_exit 的引用

c++ - 返回对 C++11 中复数的实数或虚数值的引用的函数

在本地临时目录中编译目标文件

c - 在 c 中的 main() 中使用全局变量

c - 我的函数返回错误的 double 值 (C)

c - 启动应用程序并等待其完成,而不会阻止重绘

c - 终止(可能)多字节字符串?

c - 使用 sleep 后无法在定期间隔后显示输出