linuxC基础系列内存管理动态内存分配md

28次阅读

共计 1532 个字符,预计需要花费 4 分钟才能阅读完成。

动态内存调配概述

C 语言中的所有操作都是基于内存的,变量和数组都是内存的别名,如何调配这个内存由编译器在变异期间决定的。
如定义数组时必须指定数组的长度,因而数组长度是在编译期就必须确定。
 
然而某些时候程序在运行中,可能须要应用一些额定的内存空间。

malloc 和 free

malloc 所调配的内存是一块间断的内存,以字节为单位,并且不带任何的类型信息。

free 用于将动态内存偿还零碎。其原型如下:

void *malloc(size_t size);
void free(void *p);

留神:

  • malloc 理论调配的内存可能会比申请的稍多一点,但不能依赖于这一点;
  • 当申请的动态内存无奈满足时 malloc 返回 NULL;
  • 当 free 的参数为 NULL 时,函数间接返回。

因而无论如何应用 malloc 时必须查看返回值是否可用。

calloc 和 realloc

calloc 与 realloc 相似,都可用于内存申请。原型如下:

void * calloc(size_t num,size_t size);
  • 参数:

    • num 须要申请的内存个数
    • size 每个内存块的大小
  • * 为 NULL 申请失败,非 NULL 申请胜利,其总空间为 num*size。
void * realloc(void *p,size_t new_size);
  • 参数:

    • p 原内存空间
    • new_size 所需新的内存空间
  • 返回值:

    • 为 NULL 申请失败,非 NULL 申请胜利。

由上可知 calloc 和 realloc 均可返回申请的内存信息,与 malloc 雷同应用前须要查看返回值是否可用。
与 malloc 不同,calloc 返回的内存将被初始化为 0,而 realloc 则是用于批改原已调配的内存大小,因而应用 realloc 的返回值即为新调配的内存空间,当第一个参数为 NULL 时,则 realloc 等价于 malloc。

示例如下:

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<assert.h>
#include<errno.h>
#include<stdlib.h>
int main(void)
{
    int i;
    int *pi = (int*)malloc(5*sizeof(int));
    short *ps = (short*)calloc(5,sizeof(short));
 
    assert(pi&&ps);
 
    for(i = 0;i < 5;i++){printf("pi[%d] = %d,ps[%d] = %d\n",i,pi[i],i,ps[i]);
    }
    pi = (int*)realloc(pi,10*sizeof(int));
 
    if(NULL == pi){free(pi);
        free(ps);
 
        perror("realloc\n");
        exit(EXIT_FAILURE);
    }
 
    for(i = 0;i < 10;i++){printf("pi[%d] = %d\n",i,pi[i]);
    }
 
    free(pi);
    free(ps);
 
    return 0;
}

由上可知动态内存调配是 C 语言中的弱小性能,只须可能在须要的时候动静的申请内存。

总结:

  • malloc 单纯的从零碎中申请固定字节的内存;
  • calloc 能以某种类型或指定单位大小来申请内存,并初始化为 0;
  • realloc 用于重置内存大小。

 

那么问题来了

malloc(0) 的返回值是啥?
一般来说,malloc 如返回值为 NULL 则 malloc 失败,否则将会返回一个无效的内存地址,能够被 free 掉,而这个无效的内存地址的无效内存空间为 0,因为空间为 0 的内存空间也是一个内存对象,与 NULL 的含意不同。


calloc(0,0) 的返回值又是啥?

同 malloc。


realloc(p< 不为空 >,0) 呢?

同 free。

email: MingruiZhou@outlook.com

正文完
 0