在 C 文件中,程序的不同部分会被编译器和链接器放置到不同的内存段中。这些段主要包括 text
、rodata
、bss
和 data
段。以下是它们的区别:
1. Text 段(Text Segment)
- 内容:存放程序的可执行机器码。
- 特点:只读,通常不可修改。
- 用途:存储函数体中的机器指令。
2. RoData 段(Read-Only Data Segment)
- 内容:存放常量数据,如字符串常量、全局常量等。
- 特点:只读,通常不可修改。
- 用途:存储程序运行过程中不会改变的数据。
3. BSS 段(Block Started by Symbol Segment)
- 内容:存放未初始化的全局变量和静态变量。
- 特点:在程序启动时自动清零。
- 用途:存储未初始化的全局变量和静态变量。
4. Data 段(Initialized Data Segment)
- 内容:存放已初始化的全局变量和静态变量。
- 特点:可读写。
- 用途:存储初始化后的全局变量和静态变量。
示例
假设有一个简单的 C 程序:
#include <stdio.h>
const char *hello = "Hello, world!"; // 放在 rodata 段
int global_int = 10; // 放在 data 段
int global_uninit; // 放在 bss 段
void print_hello() { // 放在 text 段
printf("%s\n", hello);
}
int main() {
print_hello();
printf("global_int: %d\n", global_int);
printf("global_uninit: %d\n", global_uninit);
return 0;
}
各段的具体内容
- Text 段:
print_hello
函数的机器码。 - RoData 段:字符串
"Hello, world!"
。 - BSS 段:未初始化的全局变量
global_uninit
。 - Data 段:已初始化的全局变量
global_int
。