zoukankan      html  css  js  c++  java
  • C学习笔记-内存管理

    作用域

    一个C语言变量的作用域可以是代码块 作用域,函数作用域或者文件作用域
    代码块是{}之间的一段代码
    同一个代码块不可以有重名变量

    auto自动变量

    一般情况下代码块内部定义的变量都是自动变量
    也可以显示的使用aotu关键字

    auto int i;
    

    register寄存器变量

    通常变量在内存当中,如果能把变量放到CPU的寄存器里面,代码执行效率会更高
    寄存器变量存在于CPU,没有内存地址,不可以取地址(&)

    register int i;
    

    static静态变量

    默认初始化为0
    static变量在程序一开始时候加载到内存就已经存在,static初值只初始化一次

    static int i = 0;
    

    局部的静态变量

    静态变量是指内存位置在程序执行期间一直不改变的变量,一个代码块内部的静态变量只能被这个代码块内部访问

    全局的静态变量

    代码块之外的静态变量在程序执行期间一直存在,但只能被定义这个变量的文件访问

    全局变量

    默认初始化为0
    全局变量在程序加载时候就存在,一直到程序退出才销毁
    全局变量的存储方式和静态变量相同,但可以被多个文件访问(extern)

    外部变量与extern关键字

    extern int i;
    

    全局函数与静态函数

    在C语言中函数默认都是全局的,使用关键字static可以将函数声明为静态

    内存四区

    内存分区可以大概分为四个区,代码区,静态区,栈区,堆区

    代码区

    代码区code,程序被操作系统加载到内存的时候,所有的可执行代码都加载到代码区,也叫代码段,这块内存是不可以在运行期间修改的
    存放程序代码指令,常量字符串
    不可读写,只可以执行
    代码区的地址可以通过函数指针来访问

    静态区

    所有的全局变量以及程序中的静态变量都存储到静态区,比较如下两段代码的区别
    存放全局变量/常量和静态变量/常量

    int a = 0;
    int main()
    {
    	static int b = 0;
    	printf("%p, %p
    ", &a, &b);
    	return 0;
    }
    
    int a = 0;
    static int b = 0;
    int main()
    {
    	printf("%p, %p
    ", &a, &b);
    	return 0;
    }
    

    栈区

    栈stack是一种先进后出的内存结构,所有的自动变量,函数的形参都是由编译器自动放出栈中,当一个自动变量超出其作用域时,自动从栈中弹出
    存放所有的自动变量,包括函数的形参都放到栈区
    栈顶指针从高位向地位递减
    C语言中,函数参数从右到左入栈
    栈空间不可以定义可变数组,其原因是栈空间大小在编译时候就要确定

    堆区

    程序可以自由的在堆中存放任何变量
    堆heap和栈一样,也是一种在程序运行过程中可以随时修改的内存区域,但没有栈那样先进后出的顺序。
    堆是一个大容器,它的容量要远远大于栈,但是在C语言中,堆内存空间的申请和释放需要手动通过代码来完成

    堆的分配和释放

    malloc

    使用关键字malloc可以在堆内存中开辟存储空间,一般使用memset将内存清零

    malloc(1024);
    memset(p, 0, 1024);
    

    注:在使用malloc开辟内存使用完成后,必须使用free释放开辟的内存

    int *p = (int *)malloc(sizeof(int));
    ···
    free(p);
    

    calloc

    int *p = (int *)calloc(100, sizeof(int));//分配100个int
    

    第一个参数是所需内存单元数量,第二个参数是每个内存单元的大小(单位:字节),calloc自动将分配的内存置0

    realloc

    用于内存的大小改变,自动释放原内存,保存新内存

    int *p = (int *)malloc(1024);
    memset(p, 0, 1024);
    ···
    p = realloc(p, 2048);
    
    realloc(NULL, 1024);
    //等价于
    malloc(1024);
    
  • 相关阅读:
    Django集成Markdown编辑器【附源码】
    Django+JWT实现Token认证
    Docker环境的持续部署优化实践
    2018-行远自迩,登高自卑
    SVN Hooks的介绍及使用
    Django开发密码管理表实例【附源码】
    Django+Echarts画图实例
    Django使用Signals监测model字段变化发送通知
    运维效率之数据迁移自动化
    Python之路(第三十四篇) 网络编程:验证客户端合法性
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664792.html
Copyright © 2011-2022 走看看