C语言内存分配-通俗理解

转载自 https://blog.csdn.net/farsight2009/article/details/53082190

姓名:张艳博 学号:17021223249

【嵌牛导读】:C语言内存分配-通俗理解

 【嵌牛鼻子】: C语言  内存

【嵌牛提问】: 该怎样c语言中的内存分配

嵌牛正文】:

最近很多同学希望了解C语言的内存分配,虽然可以在互联网上找到诸多的讲解,但是你会发现要么不通俗易懂,要么不算太全面。而这些对于新手而言,又绝对会把你弄得晕头转向的,所以在此对网上和书本上的诸般讲解,进行了通俗的翻译和总结。 在说内存分配之前,先提一点题外话,因为在和同学们讲解内存分配的时候,他们不是很明白为什么要进行这样的分配。所以先讲解下,计算机的组成和基本原理。

 一、计算机的组成 计算机的五大组成部分:运算器、控制器、存储器、输入设备和输出设备。

 我们都知道计算机的处理中心是CPU,它主要由运算器和控制器组成。 1) 运算器 实现算术运算和逻辑运算的部分,主要对数据进行加工处理。 2) 控制器 计算机的指挥中心,它通过地址访问存储器,从存储器中取出指令(程序),并指出下一指令在存储器中的位置,将取出的指令经指令寄存器送往指令译码器,经过对指令的分析产生相应的操作,控制其他部件的有条不紊的工作。 执行指令有四个步骤:取指令、指令译码、按指令操作码执行、形成下一条指令地址。 3)存储器 计算机存放所有数据和程序的记忆部分,它分为两大类:一类是内部存储器(内存),一类是外部存储器(外存)。存储器由若干个存储单元组成,每个存储单元都有一个地址,计算机通过地址对存储单元进行读写。 4) 输入设备 向计算机输入信息(程序、数据、声音、文字、图形、图像等)的设备(键盘、鼠标、图形扫描仪、触摸屏、条形码输入器、光笔等)。 5) 输出设备 主要有显示器、打印机和绘图仪等。

 二、内存分配 在任何程序设计环境及语言中,内存管理都十分重要。

在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的。因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题 1) C程序结构:可执行代码存储时 下面是C语言可执行程序的基本情况: 上面分别是:代码区、全局初始化数据区/静态数据区、未初始化数据区、十进制总和、十六进制总和、文件名。 我们可以看出程序在未运行前,没有调入到内存时,分为三个部分:代码区(text)、数据区(data)、未初始化数据区(bss)。 (1) 代码区(text) 存放CPU可执行的机器指令,由于程序被经常使用,防止其被意外修改,代码区通常是只读的。 (2) 全局初始化数据区/静态数据区(data) 存放被初始化的全局变量、静态变量(全局静态变量和局部静态变量)、常量数据(如字符串常量)。 (3) 未初始化数据区(BSS) 存放未初始化的全局变量,BSS这个叫法是根据早期的汇编运算符而来的,这个汇编运算符标志着一个块的开始。BSS区的数据在程序开始执行之前被内核初始化为0或空指针(NULL)。 2)C程序结构:程序执行时 一个正在运行的C程序,占用的内存分为5个区域:代码区、初始化数据区/静态数据区、未初始化数据区、堆区、栈区。 (1) 代码区(text) 代码区指令根据程序设计流程依次执行,对于顺序指令,则只会执行一次,如果反复,则需使用跳转指令,如果进行递归,则需借助栈来实现。 代码区包括操作码和要操作的对象(或对象的地址引用),如果是立即数(即具体的数值,如2),将直接包含在代码中;如果是局部数据,将在栈中分配空间,然后引用该数据的地址;如果是BSS区和数据区,在代码中同样引用该数据的地址。 (2) 全局初始化数据区/静态数据区(data) 只初始化一次。上面已经说过,在程序编译时,该区域已经被分配好了,这块内存在程序的整个运行期间都存在,当程序结束时,才会被释放。 (3)未初始化数据 区(BSS) 在运行时改变其值。 (4)栈区(stack) 存放函数的参数值和局部变量,由编译器自动分配释放,其操作方式类似于数据结构的栈。其特点是不需要程序员去考虑内存管理的问题,很方便;同时栈的容量很有限,在Linux系统中,栈的容量只有8M,并且当相应的范围结束时(如函数),局部变量就不能再使用。 (5)堆区(heap) 有些操作对象只有在程序运行时才能确定,这样编译器在编译时就无法为他们预先分配空间,只有程序运行时才分配,这就是动态内存分配。堆区就是用于动态内存分配(如malloc的动态内存分配),堆在内存中位于bss区和栈区之间,一般由程序员申请和释放。 之所以分配如此多的区域,主要是因为: 一个进程在运行时,代码是根据流程依次执行的,代码只需访问一次,当然跳转或递归时代码会被执行多次,而数据一般都需要访问多次,因此单独开辟空间以便访问和节约空间。 下面是一个详细的代码,来全面分析内存分配情况:

//main.c int a = 0; //a在全局初始化数据区 char *p1; //p1在bss区(未初始化全局变量) static int c = 0; //c在全局初始化数据区(c是全局静态变量) struct employee { char name[20]; int age; float score; }e1; //e1在全局初始化数据区 int main() { int b; //b在栈区(局部变量) char s[] = “abc”; //s在栈区,“abc”在常量区(全局初始化数据区) char *p2; //p2在栈区 char *p3 = “123456”; //p3在栈区,“123456”在常量区(全局初始化数据区) static int d = 0; //d在全局初始化数据区(静态局部变量) struct student { char *name; //name在栈区,name指针指向是在堆区 int age; float score; }s1; //s1在栈区 p1 = (char*)malloc(10); //分配得来的10个字节的区域在堆区 p2 = (char*)malloc(20); //分配得来的20个字节的区域在堆区 name = (cahr *)malloc(20); //分配得来的20个字节的区域在堆区 /*从常量区的“Hello World”字符串复制到刚分配到的堆区*/ strcpy(p1, “Hello World”); free(p1); //释放内存 free(p2); //释放内存 }

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 无数的字在空中游荡 殊不知诗人将其怎样拼装 无数个孤寂的夜 流浪猫也不知了去向 我久久伫立在窗前 回忆你我初见的模...
    雨众不橦阅读 231评论 0 2
  • 最近老想写点什么文章,大约是最近看书比较多,所以看着优美的文章有时会想到自己要是也能写出来就好了。但事实上除了学校...
    汤谷阅读 250评论 0 0
  • #原来这里在非饭点儿确实是咖啡厅,今天我被旁边的老师们的对话吸引了,完全看不进去书…索性放下笔假装看窗外聆听…原来...
    茁茁_a84d阅读 164评论 0 0
  • 作者:淡漠的脚步 我时常给自己做些完美的的plan,有一个月的,一周的,也有一天的,这些plan完美到就连什么时候...
    淡漠的脚步阅读 304评论 2 0