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

时间:2016-08-31 14:30:30

标签: c

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

 1. Initialized segment.
    a. Read Only.
    b. Read/Write.
 2. Uninitialized segment.
  • 读/写内存用于在文件范围内声明的变量以及静态局部变量。
  • 只读存储器用于诸如字符串之类的常量。

示例:

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

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

1 个答案:

答案 0 :(得分:3)

你说得对,差不多......程序中有三种全局静态数据:

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