数据段中只读存储器的使用

NJM*_*JMR 4 c

根据我的理解,数据段由两部分组成。

 1. Initialized segment.
    a. Read Only.
    b. Read/Write.
 2. Uninitialized segment.
Run Code Online (Sandbox Code Playgroud)
  • 读/写内存用于在文件范围内声明的变量以及静态局部变量。
  • 只读存储器用于字符串等常量。

例子:

int main(void)
{
   char* cptr = "Hello"; // The string "Hello" will sit in 'Read only' memory.
   //cptr[2] = 'Z'; // Gives seg fault. 
   ...
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,“只读”内存是否仅用于存储字符串常量?

Lui*_*ado 6

你是对的,几乎......一个程序中的全局静态数据有三种:

  • 初始化数据,只读。不仅为常量字符串保留,还为所有类型的const全局数据保留。 它不一定在数据部分,它可以在程序的文本部分(通常是.rodata段),因为它通常不能被程序修改。
  • 初始化数据,读写。通常在程序的数据段(.datasegment)。
  • 未初始化的数据,读写。通常在程序的数据部分。与前面的不同之处在于可执行文件不包括其内容,仅包括大小,因为它们被初始化为固定的已知值(零),并且可执行文件中没有初始化程序表。通常,编译器/链接器为此目的构造一个段,在该段中它仅累积组件模块(.bss段)所需的大小。