Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 代码存储器和数据存储器_C_Runtime_Compile Time - Fatal编程技术网

C 代码存储器和数据存储器

C 代码存储器和数据存储器,c,runtime,compile-time,C,Runtime,Compile Time,当我们用C编写一个特定的代码时,该代码被分配到数据内存或代码内存。这些内存何时初始化,在运行时还是编译时。有没有任何可能的解释来解释为什么会这样初始化它们?大多数代码都来自二进制映像(正如您所期望的那样),加载程序在程序运行之前会进行一些更改(例如,将导入函数的实际地址写入导入表)。在具有硬件级内存控制的系统上,加载.code的页面将标记为只读(如果硬件提供该控制级别,则为可执行页面) .数据也来自程序二进制文件,但这些页面被标记为可读写且不可执行(只读的.rodata除外) .bss不是来自二

当我们用C编写一个特定的代码时,该代码被分配到数据内存或代码内存。这些内存何时初始化,在运行时还是编译时。有没有任何可能的解释来解释为什么会这样初始化它们?

大多数代码都来自二进制映像(正如您所期望的那样),加载程序在程序运行之前会进行一些更改(例如,将导入函数的实际地址写入导入表)。在具有硬件级内存控制的系统上,加载.code的页面将标记为只读(如果硬件提供该控制级别,则为可执行页面)

.数据也来自程序二进制文件,但这些页面被标记为可读写且不可执行(只读的.rodata除外)

.bss不是来自二进制文件,它只是被分配并初始化为0(这是堆栈寿命)


完成加载后,实际程序入口点运行(非主),这将设置环境,运行初始化程序调用main运行析构函数和平台需要的任何最终分解代码。

这是一个过于笼统的问题。但在非常笼统的情况下,是的,当然所有内容都分配在某个地方,关于您的原因,您最好在wiki中阅读或学习课程\学位,我甚至不知道从哪里开始“代码”,根据其定义,永远不会存储在.data段中。数据段通常被阻止执行。此外,纯数据可能存储在.code段中–字符串文字,但也可以存储在跳转表中。代码本身也可以是数据本身。请想象反汇编程序分解自己的代码。