堆,栈,Bss,Data,text,rodata 查看指令+解释 [随手笔记]

随手笔记,bss,data,text,rodata,堆,栈

在这里插入图片描述

    Bss段,为了方便记忆也称做零段 通常是用来存放未初始化或者初始化为0的全局变量以及静态(static)变量两种情况。未初始化的值会将其初始化为0.
值得说明的是bss类型的变量不占实际的磁盘空间`,只有在运行的时候占据内存空间。

    Data段,也称为rw段,表示这片区域的数据即可以读也可以写。存放的初始化的全局变量和静态(static)变量,即占据文件大小空间也占据运行时候的内存空间,所以不易大量使用的原因。

    Rodata段,简称为ro段,表示这片区域的数据只能读,不能够写。存放的是常量数据(也就是不能修改的数据)。
例如以下三种情况

  1. #define a 10
  2. char * = “hello world”;
  3. const a =0

.    text段,存放程序的 二进制代码,即CPU执行的机器指令,并且是只读的。

    head堆区,堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。使用 malloc new 申请空间 。free delete 释放空间。

  1. char* src= (char* )malloc(100);
  2. studeng* zhangsan =new student();

    stack 栈区,存放局部变量值 函数的参数,也就是{}作用域内的。(不包块 static const),由编译器自动分配释放。

举个例子

#include <stdio.h>
define aa 1  
int a=1;
int b;
main()
{
    
    
	int c;
	char *d=123455;
	static int e=1;
	char* f =(char* )malloc(100);
}

ro段有:aa d
data段有:a e
bss段有: b
栈区有:c
堆区有:f

常见考题

1

char* a;
char *d=123455;
strcpy(a,d);

错误,d只读,不能拷贝。

2

const char *arr ="123";
char* brr ="123";
const char crr[]="123";
char drr[]="123";

题目:以上四行代码的区别。
    第一个和第二个一致,原本就保存在ro段,const本来就是修饰arr指向的值不能通过arr修改,但是“123”本来就在ro段,不能改变。所以效果一致。
    第三个在ro段,第四个在栈上,但是编译器可能会做出某些优化,把其放在ro段上。

查看指令

编译链接

gcc test.c -o test

关注文件的大小

ls -l test

查看各个段的大小(stack 和 head段)

size test

查看段表存放了各个段的各种信息,比如段的名字、段的类型、段在elf文件中的偏移、段的大小等信息。

readelf -S test

类似功能

objdump -h

猜你喜欢

转载自blog.csdn.net/weixin_44972997/article/details/114824060
今日推荐