【C语言复习(二十)】动态内存分配

1、为什么要使用动态内存分配?

C语言中的一切操作都基于内存;

变量和数组都是内存的别名,如何分配这些内存由编译器在编译期间决定:

定义数组的时候必须指定数组长度;

数组长度在编译期就必须决定;

由于以上的限制,如果在程序运行时,一旦预先定义的数组大小不够使用,那就需要重新分配内存大小,这就要使用动态内存分配。

2、C语言内存管理函数


3、malloc和calloc函数

  • malloc函数分配连续的内存区域,大小不小于size字节,但其内存单元中的内容尚未定义;
  • calloc函数分配不少于count*size的内存空间,且会把这段内存中每个字节都初始化为0
  • 它们都返回void指针,返回的指针值是“分配的内存区域中”第一个字节的地址,如果无法分配内存,则会返回空指针;
  • void指针赋值给不同类型的指针变量时,编译器会隐式类型转换;当存取分配的内存空间时,所使用的指针类型决定如何“翻译”该位置的数据;

4、realloc和free函数

  • free函数释放动态分配的内存区域,开始地址是ptrptr的值可以是空指针,调用此函数传入空指针时,函数不起任何作用;
  • realloc函数释放ptr所指的内存区域,并分配一个大小为size字节的内存区域,返回此区域的起始地址,新的内存区域可以和旧内存区域一样,起始于相同位置;
  • realloc函数会保留原始内存内容(只保留两者中比较小的空间大小),如果新的内存区域没有从原始区域的地址开始,那么realloc函数会将原始的内容复制到新的内存区域中,如果新的内存区域比较大,那么多出来的部分的值是没有定义的;
  • 可以把空指针当作ptr传入realloc函数,这样realloc函数等价于malloc函数;
  • 如果内存不足以满足新的内存分配请求,那么realloc函数返回一个空指针,这种情况下,不会释放原始内存区域,也不会改变它的内容;
  • 传入freerealloc的指针自变量(如果不是空指针的话)必须是尚未被释放的动态分配内存区域的起始地址,如果是别的值,或者是已经释放过的内存地址,程序的行为是没有定义的,linux下可能会发生段错误,Windows下可能死掉也可能正常。
  • 这些内存管理函数会在内部做记录,追踪每个分配内存区域大小,这就是为什么freerealloc函数的尝试都只需要地址,不需要区域大小的缘故,我们无法得知调用free函数是否成功,因为此函数没有返回值。 

5、使用举例

#include <stdio.h>
#include <malloc.h>
 
int main()
{
    int i = 0;
    int* pI = (int*)malloc(5 * sizeof(int));
    short* pS = (short*)calloc(5, sizeof(short));
    
    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));
    
    for(i=0; i<10; i++)
    {
        printf("pI[%d] = %d\n", i, pI[i]);
    }
    
    free(pI);
    free(pS);
    
    return 0;
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值