c语言中的内存管理

一:内存分为5大区域

栈区     --  存放局部变量

堆区     --  程序运行过程中,动态分配的内存

BSS区    --  未初始化的全局变量和静态变量

数据段    --  已经初始化的全局变量和静态变量

代码段    --  程序编译产生的二进制的数据

内存分配方式:

·1)静态分配,在编译的阶段分配的内存     int a = 10;    静态分配的内存在程序结束后会自动释放

2)动态分配,在程序的运行过程中进行的内存分配 ,动态分配的内存一般存储在堆中,程序结束后内存不会自动释放,需要手工释放

   C语言库提供了三个函数进行动态分配内存:

1>malloc

    1)malloc(长度) 向内存申请指定的长度的连续空

如果成功:返回的时新申请的内存空间的首地址

失败:返回NULL

      malloc函数的返回值为void *类型所以分配非空类型需要强转。比如(int *)malloc(sizeof(int)*元素个数);

  代码:

void m_alloc(){

    //动态申请20个字节的内存空间,内存空间的首地址放到p中
    int *p = (int *)malloc(5*sizeof(int));
    //判断是否分配成功
    if(p!=NULL){

        memset((void *)p,0,sizeof(p));
        for (int i=0; i<5; i++) {
            printf("%d\t",*p++);
        }
        printf("\n");
        //如果成功,可以存放数据了
        *p = 1;
        *(p+1) = 10;
        *(p+2) = 100;
        *(p+3) = 1000;
        *(p+4) = 10000;

        for (int i=0; i<5; i++) {
            printf("%d\t",*p++);
        }

    }else{
        printf("内存分配失败!");
    }

}

注意:

1)malloc()  申请的空间,如果不初始化,存放的也是垃圾数

2)进行初始化  memset(地址,用什么初始化,长度);    

2> calloc  

calloc(4,4)  第一个4,申请几块    第二个4 每一块的长度4               calloc(10,sizeof(int));

void c_alloc(){

    //        (void *)      分5块    每块的大小
    char *p = (char *)calloc(5, sizeof(char));
    char *p1=p;
    //  判断是否成功
    if (p!=NULL) {

        //        for (int i=0; i<5; i++) {
        //            printf("%d\t",*p++);
        //        }

        printf("\n");

        for (int i=0; i<5; i++,p++) {
            *p=65+i;

        }

        //        *p = ‘A‘;
        //        *(p+1)=65;
        //        *(p+2)=‘a‘;
        //        *(p+3)=‘z‘;
        //        *(p+4)=‘x‘;

        for (int i=0; i<5; i++) {
            printf("%c\t",*p1++);
        }

    }

}

经常用来申请数组的空间

注意:   calloc 可以帮我们自动初始化为0

3>realloc

realloc(地址,新的长度)      重新修改大小后,让原指针重新指向一次    p = (int *)realloc(p,100);

void re_alloc(){

    //        (void *)      分5块    每块的大小

    char *p = (char *)calloc(5, sizeof(char));

    char *p1=p;

    //  判断是否成功

    if (p!=NULL) {

        for (int i=0; i<5; i++,p++) {

            *p=65+i;

        }

        // A B  C D E

        //重新修改大小以后,重新指向一次

        p1 = realloc(p1, 7*sizeof(char));

        *(p1+5)=‘a‘;

        *(p1+6)=‘b‘;

        for (int i=0; i<7; i++) {

            printf("%c\t",*p1++);

        }

    }

4)free();

为什么要使用free()

如果不使用free释放掉我们自己申请的内存空间,有可能会造成内存泄露

free 释放存储空间

int *p = (int *)malloc(12);

free(p);  //释放

*p = 10; (错误的)因为p所指向的内存空间已经被释放所以*p所指向的内存空间不能赋值操作,一般我们要讲指针为空   p = NULL;

时间: 2024-10-12 22:49:40

c语言中的内存管理的相关文章

c 从语言中的内存管理

在C里,内存管理是通过专门的函数来实现.另外,为了兼容各种编程语言,操作系统提供的接口通常是 C 语言写成的函数声明(Windows 本身也由C和汇编语言写成). 1 分配内存 malloc 函数 需要包含头文件: <stdlib.h>   and   <malloc.h> 函数声明(函数原型) void *malloc(int size); 说明:malloc 向系统申请分配指定size个字节的内存空间.返回类型是 void* 类型.void* 表示未确定类型的指针.C,C++规

Cocos2d-x开发中C++内存管理

由于开始并没有介绍C++语言,C++的内存管理当然也没进行任何的说明,为了掌握Cocos2d-x中的内存管理机制,是有必要先了解一些C++内存管理的知识.C++内存管理非常复杂,如果完全地系统地介绍可能需要一本书的篇幅才能解释清楚.这里只给大家介绍C++内存管理最为基本的用法. 内存分配区域创建对象需要两个步骤:第一步,为对象分配内存,第二步,调用构造函数初始化内存.在第一步中对象分配内存时候,我们可以选择几个不同的分配区域,这几个区域如下:栈区域分配.栈内存分配运算内置于处理器的指令集中,效率

C语言中关于内存那些事

因为要学IOS开发,为了更好的学习OC所以又从头开始学习C语言,这篇文章主要记录关于C语言中内存布局.以及不同的内存区域的特点. C语言的程序内存布局,从高到低依次为:栈区.堆区.未初始化数据区.初始化数据区.代码区. 一.栈区 由编译器自动管理,无需程序员手工控制.存放函数的参数值.局部变量的值等.栈区内容从高地址到低地址分配,从低地址到高地址存取. int a = 0; int b = 0; int array[5] = {1, 2, 3, 4, 5}; printf("&a....

YJX_Driver_033_驱动中的内存管理

1. 驱动中的内存管理 A. 物理内存 B. 虚拟内存 C. Ring0地址和Ring3地址 D. 驱动程序和进程的关系 E. 分页和非分页内存 F. 分配内核内存 [120]了解两个概念:物理内存  虚拟内存 [140]以下概念针对 32位Windows操作系统(32位及以上的CPU)(32位 / 64位 CPU) [210]64位下的这些概念 略有区别 [240] “ A.物理内存:(Physical Memory Address) 目前主流的操作系统还是32位的XP,而32位的系统提供的寻

Android中的内存管理机制以及正确的使用方式

概述 从操作系统的角度来说,内存就是一块数据存储区域,属于可被操作系统调度的资源.现代多任务(进程)的操作系统中,内存管理尤为重要,操作系统需要为每一个进程合理的分配内存资源,所以可以从两方面来理解操作系统的内存管理机制. 第一:分配机制.为每一个进程分配一个合理的内存大小,保证每一个进程能够正常的运行,不至于内存不够使用或者每个进程占用太多的内存. 第二:回收机制.在系统内存不足打的时候,需要有一个合理的回收再分配的机制,以保证新的进程可以正常运行.回收的时候就要杀死那些正在占有内存的进程,操

IOS阶段学习第20天笔记(OC中的内存管理)

IOS学习(OC语言)知识点整理 一.OC中的内存管理 1)概念:内存管理的对象为所有继承了NSObject的对象,对基本数据(如:int .float.double...)无效      OC中采用引用计数器对内存做管理,他是一个整数数据,表示对象引用的次数,每个对象分配4字节      的内存空间存放引用计数器.当一个对象的引用计数器为0时 它将被自动释放,反过来说 当使用alloc.      new .copy(mutableCopy)创建新对象时,引用计数器默认为1 2)黄金法则 当使

cocos2dx中的内存管理机制及引用计数

1.内存管理的两大策略: 谁申请,谁释放原则(类似于,谁污染了内存,最后由谁来清理内存)--------->适用于过程性函数 引用计数原则(创建时,引用数为1,每引用一次,计数加1,调用结束时,引用计数减1,当引用计数为0时,才会真正释放内存) --------->适用于注册性函数(消息处理,中断等场合) 2.cocos2dx中的内存管理采用引用计数和内存托管的原则 spr->retainCount();//获取对象的引用计数值 spr->retain();//引用计数加1 spr

关于OC中得内存管理问题,alloc,retain,release,copy,dealloc

我们都知道,一个手机,它的内存是有限的,而每一个手机应用都是需要一定空间,当应用所占空间过大时,系统就会发出警告,怎样在有限的空间中,做到更高效实用美观的效果呢? 这时候就牵涉到OC中得内存管理了. 在OC这门语言中,是不存在垃圾回收机制的,但是它采用了另外一种形式或者说方法,实现这一个空间回收的效果,那就是引用计数器. 别看-引用计数器,这个名字很高大上,实际是它就是一个整数. 所以OC中分配4个字节才存储它. 引用计数的值只有两种:0和非0,我们知道,计算机其实是很笨的,结果只有这两种时,它

Unity游戏开发中的内存管理_资料

内存是手游的硬伤——Unity游戏Mono内存管理及泄漏http://wetest.qq.com/lab/view/135.html 深入浅出再谈Unity内存泄漏http://wetest.qq.com/lab/view/150.html 这一次,我优化了37%的内存http://wetest.qq.com/lab/view/147.html Unity项目资源加载与管理http://wetest.qq.com/lab/view/124.html Android应用内存泄露分析.改善经验总结h