C语言——内存分配
1、在C语言的运行过程中,需要内存来存储数据。C语言使用的内存总体可以分为两类:一类是静态区,一类是动态区。
2、静态数据存储区包含:只读数据区、已初始化的读写数据区、未初始化的读写数据区
动态数据存储区包含:堆内存区域、栈内存区域

3、C语言编写的程序经过编译-连接之后,将形成一个统一的文件,它由几个部分组成:
代码段(code或text)、只读数据段(RO data)、宏定义、已初始化读写数据段(RW data)、未初始化读写数据段(BSS)、堆(heap)、栈 (stack)
代码段: 由各个函数产生,函数的每一条语句最终都生成机器码,例如普通的数学运算、条件语句、循环语句
只读数据段: 由程序使用的数据产生,该部分数据的特点是不需要修改,因此被放入只读部分;
例如:只读全局变量 const char a[10] = "hello!!!"; 只读局部变量 const char str[8] = "world"; 程序中使用的常量 printf("ni hao c\n"); "ni hao c\n"就被放入只读数据区
4、已初始化数据段,又称为读写数据段,它里面的变量可读可写,
例如: 已初始化的全局变量 int a = 10; 以初始化的局部静态变量,在函数体内定义 static int num = 10;
5、未初始化数据段,该段的数据没有初始化,它只在目标文件中被标识,并不会称为一个真正的段。只有在程序运行的初始化阶段才会产生,因此不会影响目标文件大小
6、堆 只在程序运行的过程中出现,一般由程序员分配和释放
7、栈 只在程序运行的过程中出现,在函数内部使用的变量、函数的参数以及返回值将使用栈空间
栈的特点是先进后出
栈的增长方式有2种:一种是向上增长的,即从低地址向高地址增长;一种是向下增长的,即从高地址向低地址增长。目前绝大多是系统是递减的
根据栈的指针位置又可以讲栈分为满栈和空栈。
按照满栈的处理情况:入栈的时候,入栈内容放在栈指针移动后的内存地址;出栈的时候,将弹出当前栈指针地址的内容
按照空栈的处理情况:入栈的时候,入栈内容放在当前栈指针的内存地址中;出栈的时候,将弹出栈指针移动后地址的内容




http://blog.chinaunix.net/uid-29958512-id-4584209.html
C语言——内存分配的更多相关文章
- C语言内存分配方法。
当C程序运行在操作系统上时,操作系统会给每一个程序分配一定的栈空间. 堆为所有程序共有的,需要时需要申请访问. 一.栈 局部变量.函数一般在栈空间中. 运行时自动分配&自动回收:栈是自动管理的 ...
- 【嵌入式开发】C语言 内存分配 地址 指针 数组 参数 实例解析
. Android源码看的鸭梨大啊, 补一下C语言基础 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/detai ...
- 图解Go语言内存分配
目录 基础概念 内存管理单元 内存管理组件 mcache mcentral mheap 内存分配流程 总结 参考资料 Go语言内置运行时(就是runtime),抛弃了传统的内存分配方式,改为自主管理. ...
- 内存管理 垃圾回收 C语言内存分配 垃圾回收3大算法 引用计数3个缺点
小结: 1.垃圾回收的本质:找到并回收不再被使用的内存空间: 2.标记清除方式和复制收集方式的对比: 3.复制收集方式的局部性优点: https://en.wikipedia.org/wiki/C_( ...
- 关于c语言内存分配,malloc,free,和段错误,内存泄露
1. C语言的函数malloc和free (1) 函数malloc和free在头文件<stdlib.h>中的原型及参数 void * malloc(size_t size ...
- Go语言内存分配机制
前言: 本文是学习<<go语言程序设计>> -- 清华大学出版社(王鹏 编著) 的2014年1月第一版 做的一些笔记 , 如有侵权, 请告知笔者, 将在24小时内删除, 转载请 ...
- C语言 内存分配 地址 指针 数组 参数 实例解析
. Android源码看的鸭梨大啊, 补一下C语言基础 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/detai ...
- C语言内存分配函数malloc——————【Badboy】
C语言中经常使用的内存分配函数有malloc.calloc和realloc等三个,当中.最经常使用的肯定是malloc,这里简单说一下这三者的差别和联系. 1.声明 这三个函数都在stdlib.h库文 ...
- Go语言内存分配(简述 转)
在Go语言里,从内存的分配到不再使用后内存的回收等等这些内存管理工作都是由Go在底层完成的.虽然开发者在写代码时不必过度关心内存从分配到回收这个过程,但是Go的内存分配策略里有不少有意思的设计,通过了 ...
- C语言内存分配
(1)代码区(text segment).存放CPU执行的机器指令(machine instructions).通常,代码区是可共享的 (即另外的执行程序可以调用它),因为对于频繁被执行的程序,只 ...
随机推荐
- 浅析CSS负边距
本文主要讨论两点,1.左右负边距对元素宽度的影响:2.负边距对浮动元素的影响. 在讨论这两点前,首先要理解盒模型.文档流. 盒模型,见下图,简单明了. 文档流,将窗体自上而下分成一行行, 并在每行中按 ...
- Javascript performance
I just went through some vedio related to javascript performance which is great, Here is the notes I ...
- Win API 内存整理
记得我的笔记本上曾经安装了一款名为内存整理大师的软件,当时觉得挺好用而且挺NB的,就是导致开机启动有点慢. 当时我就在想,内存整理是怎么实现的?不过那是水平实在是不怎么样,估计连windows程序的消 ...
- ftp 建立、配置、实用软件 fileZilla server
ftp 建立.配置.实用软件 fileZilla server
- armeabi,armeabi-v7a ,x86 和mips 都是什么?
首先要明白ABI的概念: ABI(Application Binary Interface)实际就是指应用程序基于哪种指令集来进行编译,我们能用到的ABI 也就四种 armeabi,armeabi ...
- 汉字编码:GB2312, GBK, GB18030, Big5
前一篇博文:ANSI是什么编码?中有这样一段小故事: 话说计算机是由美国佬搞出来的嘛,他们觉得一个字节(可以表示256个编码)表示英语世界里所有的字母.数字和常用特殊符号已经绰绰有余了(其实ASCII ...
- Using Git subtrees to split a repository
https://lostechies.com/johnteague/2014/04/04/using-git-subtrees-to-split-a-repository/ We are in a p ...
- C#的运算符重载
运算符重载看起来与标准静态方法声明类似,但它们使用关键字operator和运算符本身,而不是一个方法名: public static 返回类型 operator +(类型1 变量1,类型2 变量2) ...
- 一、Oracle分析函数入门
分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值. 分析函数和聚合函数的不同 ...
- core--线程同步
[同步(tóng bù)synchronous;sync;synchronism;synchronization 指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系.]这是百度百科对&quo ...