我当时正在研究OS基础知识的测试,这在我脑海中浮现。当我在C程序中声明全局(或静态)变量时,如下所示:
char* msg = "Hello World!\n";
在
.data
中保留一个字节数组,并将"Hello World!\n"
字符串保存在.text
中,然后在将程序加载到内存并开始执行时,使用保存在msg
中的字符串初始化.text
var。这会发生什么吗?那么,在.data
中保留字节而不是在堆中保留字节之间的区别是什么?我知道在.data
中它们的大小是静态的,但是它们也可以保留在堆中,对吗?为什么这些东西分开?在过程镜像中仅包含堆,堆栈和代码部分,而不是更多部分,不是更有效吗?不可能是因为物理内存被映射到多个虚拟地址(例如记事本的多个实例),因为这些变量是可编辑的。先感谢您
最佳答案
该编译器的作用是使此(常量)文字成为读/写变量。
编译器以.text
收集所有文字字符串。当在程序中多次使用文字字符串时,它将仅使用一次.text
中的文字。
在启动时,它将其复制到.data
中的保留空间。这很好笑:
char msg[] = "Hello World!\n";
char *msg = "Hello World!\n";
编译器将第一个文字从
.text
复制到.data
是可以的;它正在按照用户说明初始化变量。编译器将第二个文字复制到
.data
是不正确的:它应该已经初始化*msg
,并且指向.text
中的文字,并且.text
段应设为只读(由内存硬件管理,当内存为尝试写入)。