C语言笔记

 
 
栈区
    栈stack是一种先进后出的内存结构,所有的自动变量,函数的形参都是由编译器自动放出栈中,当一个自动变量超出其作用域时,自动从栈中弹出。出入栈是由C语言编译器自动分配释放。
    栈不会很大,一般都是以K为单位。
栈溢出:当栈空间已满,但还往栈内存压变量,叫做栈溢出。
速度较快,效率较高
 
堆区
    堆heap和栈一样,也是一种在程序运行过程中可以随时修改的内存区域,但是没有栈那样先进后出的顺序。
    堆是一个大容器,它的容量要远大于栈,在C语言中,对内空间的申请和释放需要手动通过代码来完成。堆使用完后必须释放。速度较慢,效率较低。
    堆的分配和释放——malloc()和free()(在stdlib.h中定义)
 
静态区(static)——存储全局变量和静态变量。程序结束后由系统自动释放。
 
代码区(code)——存放函数的程序代码,执行的过程中不能修改。
 
不能将一个栈变量的地址通过函数的返回值返回。
即:在函数中定义的变量地址不能作为该函数的返回值。
函数可以通过返回值返回一个堆地址,但是在后边一定要配合free()使用。
//*************************************
int *geta()//错误,栈地址不能作为函数返回值
{
    int a = 0;
    return &a;    
}
//*************************************
int *getb()    //正确,申请的堆空间可以作为函数返回值,要配合free()函数使用
{
    int *p = malloc();
    return p;
}
//************************************
int *getc()    //正确,static变量在静态区,程序运行,地址一直有效,不能使用free()释放
{
    static int a = 0;
    return &a;
}
//************************************
void getheap(int *p)    //p是形参,定义在栈中,函数执行完后,p被释放,p所指向的堆空间没有被释放,导致p指向的具体堆空间的地址丢失。
{
    p = malloc();
}
int main()
{
    int *p = NULL;
    getheap(p);
    ......
    free(p);
    return 0;
}
//错误
//***********************************
void getheap(int **p)    //正确
{
    *p = malloc();
}
int main()
{
    int *p = NULL;
    getheap(p);
    ......
    free(p);
    return 0;
}
//***********************************
int *getheap(int *p)    //正确
{
    p = malloc();
    return p;
}
int main()
{
    int *p = NULL;
    p = getheap(p);
    ......
    free(p);
    return 0;
}
//***********************************
 
 
2、堆栈和内存映射
每个线程都有自己专属的栈,先进后出
栈的最大尺寸固定超出则会引起栈溢出
变量离开作用范围后,栈上的数据会自动释放
堆上内存必须手工释放,
int main()
{
    int i = 0;
    scanf("%d", &i);
    int array[i];    //错误,定义数组时,数组长度必须是常量,不能是变量
    int *array = malloc();
]
 
明确知道数据占用多少内存,数据量很小——使用栈空间
不确定需要多少内存,大量数据——使用堆空间
 
堆(heap):由程序员控制,使用malloc/free操作
栈(stack):预先设定大小,自动分配与释放
堆和栈占用内存数据区空间
 
内存映射:
栈:
栈顶从高地址向低地址方向增长
存储非静态局部变量、函数参数、返回地址
C语言中函数的参数列表是从右往左入栈的
 
堆的分配和释放
在Linux下查看C语言程序内存使用情况:
编写C语言程序,编译运行,ps -u test——查看进程PID,cd /proc,cd PID,cat maps——显示内存使用情况,cat smaps——显示更详细的内存使用情况。
操作系统在管理内存时,最小单位不是字节,而是内存页,内存页大小一般为4K
32位系统最多管理4GB内存
 
calloc()函数在堆空间中定义一块内存,并将其初始化为0;
 
realloc(NULL, 5);    等同于    malloc(5);
 
 
 
 
 
 
 

C语言学习笔记——堆和栈——未整理的更多相关文章

  1. Java学习笔记--堆、栈、常量池

    参考资料:http://blog.csdn.net/miraclestar/article/details/6039743 Java内存区域模型主要分为4部分 1.方法区 2.本地方法栈 3.栈 4. ...

  2. C语言中的堆与栈20160604

    首先声明这里说的是C语言中的堆与栈,并不是数据结构中的!一.前言介绍:C语言程序经过编译连接后形成编译.连接后形成的二进制映像文件是静态区域由代码段和数据段(由二部分部分组成:只读数据 段,未初始化数 ...

  3. Go语言学习笔记十一: 切片(slice)

    Go语言学习笔记十一: 切片(slice) 切片这个概念我是从python语言中学到的,当时感觉这个东西真的比较好用.不像java语言写起来就比较繁琐.不过我觉得未来java语法也会支持的. 定义切片 ...

  4. C语言学习笔记8-函数

    C语言学习笔记8-函数  ...待编辑 1.汇编看函数调用过程 2.函数调用过程图示:学好C这个是关键,要懂得原理 标准调用(_cdecl) 参数由右往左入栈,调用者平衡栈(即入多少参数后参数调用玩后 ...

  5. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

  6. 2017-04-21周C语言学习笔记

    C语言学习笔记:... --------------------------------- C语言学习笔记:学习程度的高低取决于.自学能力的高低.有的时候生活就是这样的.聪明的人有时候需要.用笨的方法 ...

  7. 2017-05-4-C语言学习笔记

    C语言学习笔记... ------------------------------------ Hello C语言:什么是程序:程序是指:完成某件事的既定方式和过程.计算机中的程序是指:为了让计算机执 ...

  8. 【转】C语言堆栈入门——堆和栈的区别

    @2019-04-25 [小记] C语言堆栈入门——堆和栈的区别

  9. GO语言学习笔记(一)

    GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...

随机推荐

  1. iOS开发中常见的语句@synthesize obj=obj的意义详解

    我们在进行iOS开发时,经常会在类的声明部分看见类似于@synthesize window=_window; 的语句,那么,这个window是什么,_ window又是什么,两个东西分别怎么用,这是一 ...

  2. C# - 系统类 - Math类

    Math类 ns:System 此类除了提供了最基本的运算功能 还提供了三角.指数.超常的计算 它的所有方法都是静态的 Math类的字段 E 常量e 自然对数底 值为2.71828182845905 ...

  3. 【转】cocos2d-x 开发中使用的一些工具

    http://k57box.blog.163.com/blog/static/142261374201327112050361/ 这些工具平常也用到,不过没有像这样整理出来,这是我在网上看到的.就记录 ...

  4. Cocos2D-x培训课程

    1.1 Cocos2D-x 什么是cocos2d-x cocos2d-x在游戏开发中的运用 cocos2d-x的几个重要版本特点 iOS环境下搭建cocos2d开发环境 windows平台搭建coco ...

  5. phpcms 源码分析五:文件缓存实现

    这次是逆雪寒的文件缓存实现代码分析: /* [/php] PHPCMS的文本缓存实现: [php] <?php /* 这个文件里面全是有关生成文本缓存的函数.文本缓存是个好东西.一般的项目,我们 ...

  6. 【转】hibernate.hbm.xml详解

    在Hibernate中,各表的映射文件….hbm.xml可以通过工具生成,例如在使用MyEclipse开发时,它提供了自动生成映射文件的工具.配置文件的基本结构如下: Xml代码 <?xmlve ...

  7. DirectShow初探

    filtergraphmanagernullmicrosoftdirect3d 可能到现在为止,还没有哪个玩过游戏的人没有接触过Microsoft的DirectX的.因为现今大多数的游戏都是用Dire ...

  8. RxAndroid结合Retrofit,看看谁才是最佳拍档!

    这篇博文酝酿好久了,今天终于下定决心开始写!RxAndroid和Retrofit都算是当下非常流行的Android开发框架,这两个框架光是单独使用就已经爽歪歪了,那么将RxAndroid和Retrof ...

  9. Linux Bash终端支持中文显示

    方法:修改系统变量LANG 即时生效: LANG=en_US.UTF- 永久生效: 修改.bashrc,加入 fi

  10. .net的 async 和 await

    async 和 await 出现在C# 5.0之后,关系是两兄弟,Task是父辈,Thread是爷爷辈,这就是.net 多线程处理的东西,具体包括 创建线程,线程结果返回,线程中止,线程中的异常处理 ...