c - 每个静态和全局(未初始化/初始化变量)的数据段内存分配不正确
问题描述
我试图了解内存分配如何适用于任何执行或编译的 C 代码。
我编写了以下 5 个单独的小代码,它们将帮助我理解内存分配过程。
段大小1.c
int main(){ printf("hellow world"); return 0; }
段大小2.c
//Adding uninitialized static int variable This would increase the size of BSS by 4 bytes. int main() { static int mystatic; printf("Hellow world"); return 0; }
段大小3.c
// Adding initialized static int variable, this would increase the size of initialized data // segment by 4 bytes. int main() { static int mystatic; static int mystatic1 = 100; printf("Hellow world"); return 0; }
段大小4.c
// Adding un-initialized global int variable, this would increase the size of BSS segment by 4 bytes. int myglobal; int main() { static int mystatic; static int mystatic1 = 100; printf("Hellow world"); return 0; }
段大小5.c
// Adding initialized global int variable, this would increase the size of data segment by 4 bytes. int myglobal; int myglobal2 = 500; int main() { static int mystatic; static int mystatic1 = 100; printf("Hellow world"); return 0; }
根据我的理解,如果我们编译上面的文件,那么在编译segment_size2.c后BSS大小应该增加4个字节,编译segment_size3.c后数据大小应该增加4个字节。但是当我点击 size 命令时,我得到了以下结果,
size segment_size1 segment_size2 segment_size3 segment_size4 segment_size5
text data bss dec hex filename
1217 560 8 1785 6f9 segment_size1
1217 560 8 1785 6f9 segment_size2
1217 564 12 1793 701 segment_size3
1217 564 12 1793 701 segment_size4
1217 568 16 1801 709 segment_size5
在这里我们可以清楚地看到编译segment_size3后bss和data段同时更新。这怎么可能?
解决方案
我们可以清楚地看到 bss 和 data 段是同时更新的
这是保存初始值 != 0 的位置和静态/全局变量的位置之间的区别
在主执行之前,初始值 !=0 被复制到全局/静态变量中,初始值为 0 的全局/静态变量当然也设置为 0
推荐阅读
- postgresql - pod 应该用来连接到同一集群中的 postgresql pod 的连接字符串?
- javascript - 我使用 v-model 作为输入和名称。我试图了解访问其数据的不同方式
- css - css fontawesome 图标与按钮 ReactJS 内的两个文本行对齐
- android - 为Android构建时FeathersJS登录错误
- ruby-on-rails - 为什么我不能在 dockerfile 中加载环境变量?
- git - 操作在 300000 毫秒后超时,在“git clone”上收到 0 个字节中的 0 个字节
- python - ValueError:检查输入时出错:预期 conv2d_1_input 的形状为 (128, 75, 1) 但得到的数组的形状为 (1, 128, 1)
- excel - 用户表单的复杂变量名称
- python - Python3 argparse:当将字符串作为 arg 传递时运行 funcA,如果虚线 arg 运行另一个 func
- python - 为什么 python subprocess 命令在通过 API 调用执行时得到 [Errno 2] No such file or directory: 'ls': 'ls'