虚拟内存的产生和分布

本文详细解释了C语言中虚拟内存的分布,包括BSS段(存放未初始化全局变量)和数据段(存放已初始化全局变量),以及栈区、堆区的使用。通过实例展示了不同变量在这些区域的定位,并介绍了静态和动态内存分配的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虚拟内存的产生:

虚拟内存分布:

C语言角度上分布为区;

操作系统上分布为段;

练习1://question:变量 a,b,c,d,e,f,g,h,*h,i,p,*p分别在哪个区?

bss(Block Started by Symbol)段:是指用来存放程序中未初始化的全局变量的一块内存区域。
BSS段属于静态内存分配,.bss段是不占用.exe文件空间的,其内容由操作系统初始化(清零)。

数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。
数据段属于静态内存分配。.data需要占用.exe文件空间,
其内容由程序初始化。数据保存在目标文件中。

#include<stdio.h>
int a;            //.bss段

static int b;       //.bss段

int c=10;            //.data段

static int d=20;        //.data段

void  function()
{
 int e=30;                //栈区
 printf("hello world");       //代码区
}

int main()
{
    static int f=40;        //.data
    
    g=50;                    //栈区
    
    char *p="hello world";           //p在 栈区  
                                      //*p指向是 常量字符串 rodata(只读数据)
                                     
    int *h=(int*)malloc(sizeof(int)*10);        
    //h:栈区     // *h 堆区
    
    return 0;
}

图解:

练习2:question:变量 a,b,c,d,e,f,*d,*e,*f 分别在哪个区?

#include<stdio.h>
int a=100;            //.data段
int b;       //.bss段

int main()
{
    int c=10;        //栈区
    char d[20]="hello world";   //d 栈 *d栈     
    char *e=malloc(20);//e 栈区  *d堆区
    char *f="hello world";   //f 栈区 *f rodata区 
    return 0;
}

图解:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值