C之动态内存分配

在编写程序时,通常并不知道需要处理的数据量,或者难以评估所需处理数据量的变动程度。在这种情况下,要达到有效的资源利用,必须在运行时动态地分配所需内存,并在使用完毕后尽早释放不需要的内存,这就是动态内存管理原理。

动态内存管理同时还具有一个优点:当程序在具有更多内存的系统上需要处理更多数据时,不需要重写程序


参考文章:

[1] C语言动态内存管理和动态内存分配


1、动态内存管理

标准库 stdlib.h 提供以下四个函数用于动态内存管理:

(1) malloc()、calloc():分配新的内存区域

(2) realloc():调整已分配的内存区域

(3) free():释放已分配的内存区域

对象在内存中所占空间的大小是以字节数量为单位计算的。许多头文件(包括 stdlib.h)专门定义了类型 size_t 用来保存这种内存空间的相关信息。例如,sizeof 运算符以类型 size_t 返回字节数量。

2、动态内存分配

两个内存分配函数 malloc()和 calloc()的参数不一样:

① malloc( )  

void*malloc(size_t size);
  • 函数 malloc()分配连续的内存区域,其大小不小于 size。当程序通过 malloc()获得内存区域时,内存中的内容尚未决定。
#include <stdlib.h>
#include <stdio.h>

int main()
{
    int *ptr = malloc(3*sizeof(int));
    if(ptr == NULL)
        return -1;
    else{
        printf("*ptr = %d\n",*ptr);
        *ptr = 3;
        *(ptr+1) = 4;
        *(ptr+2) = 5;
        for(int i = 0;i < 3;i++)
            printf("ptr %d = %d\n",i,ptr[i]);
    }
    printf("Hello World!\n");
    free(ptr);
    return 0;
}

输出:

② calloc( )

void*calloc(size_t count,size_t size);
  • 函数 calloc()分配一块内存区域,其大小至少是 count_size。换句话说,上述语句分配的空间应足够容纳一个具有 count 个元素的数组,每个元素占用 size 个字节。而且,calloc()会把内存中每个字节都初始化为 0。
#include <stdlib.h>
#include <stdio.h>

int main()
{
    //数组大小未知
    int n;
    scanf("%d",&n);
    int *ptr = calloc(n,sizeof(int));
    if(ptr == NULL)
        return -1;
    else{
        printf("*ptr = %d\n",*ptr);
        for(int i = 0;i < n;i++)
            *(ptr+i) = i;
        for(int i = 0;i < n;i++)
            printf("ptr %d = %d\n",i,ptr[i]);
    }
    printf("Hello World!\n");
    free(ptr);
    return 0;
}

输出:初始值为0

两个函数都返回 void 指针,这种指针被称为无类型指针(typeless pointer)。返回指针的值是所分配内存区域中第一个字节的地址,当分配内存失败时,返回空指针。

当程序将这个 void 指针赋值给不同类型的指针变量时,编译器会隐式地进行相应的类型转换。然而,一些程序员倾向于使用显式类型转换。当获取所分配的内存位置时,所使用的指针类型决定了该如何翻译该位置的数据。


 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值