gpt4 book ai didi

c - 为什么全局变量存储在 .data 中而不是过程镜像的堆中?

转载 作者:太空狗 更新时间:2023-10-29 15:40:09 24 4
gpt4 key购买 nike

我正在学习操作系统基础知识的测试,我想到了这一点。当我在 C 程序中声明一个全局(或静态)变量时:

char* msg = "Hello World!\n";    

字节数组保存在.data中,"Hello World!\n"字符串保存在.text中,然后当程序加载到内存并开始执行时,msg var 将使用保存在 .text 中的字符串进行初始化。这是怎么回事?那么,在 .data 中而不是在堆中保留字节有什么区别?我知道在 .data 中它们有一个静态大小但它们也冷保留在堆中,对吧?为什么这些东西要分开?在过程镜像中只包含堆、堆栈和代码部分而不是更多的部分不是更有效吗?这不可能是因为物理内存被映射到多个虚拟地址(例如记事本的多个实例),因为这些变量是可编辑的。

提前致谢

最佳答案

这个编译器所做的是使这个(常量)文字成为一个读/写变量。

编译器在 .text 中收集所有文字字符串。当程序中多次使用文字字符串时,它只会在 .text 中使用该文字一次。

在启动时,它会将其复制到 .data 中的保留空间。这很有趣:

char msg[] = "Hello World!\n";
char *msg = "Hello World!\n";

编译器将第一个文字从.text 复制到.data 是可以的;它正在按照用户的说明初始化变量。

编译器将第二个文字复制到 .data 是不正确的:它应该初始化 *msg 并指向 .text< 中的文字.text 段应该设为只读(由内存硬件管理,在尝试写入内存时导致异常)。

关于c - 为什么全局变量存储在 .data 中而不是过程镜像的堆中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40307449/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com