C语言程序内存分配中的堆和栈

1. C/C++编译的程序占用的内存

这里写图片描述

1.1 可以看出,此可执行程序在存储时(没有调入到内存)分为代码区(text)、数据区(data)和未初始化数据区(bss)3个部分。

(1)代码区(text segment)
放CPU执行的机器指令(machine instructions)。
(2)全局初始化数据区/静态数据区(initialized data segment/data segment)
该区包含了在程序中明确被初始化的全局变量、静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)。
例如,一个不在任何函数内的声明(全局数据):

int i = 0;             /*变量i根据初始值存放到全局初始化数据区*/
char* str = "abcd"     /*abcd存放在文字常量区*/

(3)未初始化数据区(uninitialized data segment),也称BSS区(block started by symbol)
该区存放程序中未初始化的全局变量。

static int i;     /*假设声明在函数外*/

话说,静态全局变量不是默认初始化为0吗?

1.2 一个正在运行着的C编译程序占用的内存分为代码区、初始化数据区、未初始化数据区、堆区和栈区5个部分。

(4)栈区
栈又称堆栈,英文statck,由编译器自动分配释放,存放函数的参数值、局部变量的值等(不包括static声明的变量,static意味着在数据段中存放变量)。除此之外,在函数被调用时,栈用来传递参数和返回值。由于栈先进后出、后进先出的特点,栈特别方便的用来保存和恢复调用现场。

(5)堆区
用于动态内存分配。堆在内存中位于bss区和栈区之间。一般由程序员分配和释放,若程序员不释放,程序结束时有可能由OS回收。
C程序执行时的内存分配情况示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int a = 0;                    /*全局初始化区*/    
int b;                        /*全局未初始化区 BSS*/ 
char* p1;                     /*全局未初始化区 BSS*/
int main()    
{    
    int b;                    /*栈*/     
    char s[] = "abc";         /*栈*/
    char* p2;                 /*栈*/    
    char* p3 = "123456";      /*123456/0在常量区,p3在栈上*/  
    static int c = 0;        /*全局(静态)初始化区*/
    p1 = (char *)malloc(10);    
    p2 = (char *)malloc(20);  /*分配得来得10和20字节的区域就在堆*/
    strcpy( p1, "123456");    /*123456/0在常量区,编译器可能会将p1与p3指向的"123456"优化成一个地方*/
    return 0;
}

这段代码我没有验证

 转载:C语言程序内存分配中的堆和栈_老胡要顺利毕业的博客-CSDN博客_c语言堆和栈内存分配

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值