text段, rodata段,bss段和data段有什么区别

在 C 文件中,程序的不同部分会被编译器和链接器放置到不同的内存段中。这些段主要包括 textrodatabss 和 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值