【C】第3天 关于动态内存分配的两个函数malloc()和free()

动态内存分配 Memory

C函数库<stdlib.h>定义了malloc()free()两个函数用于动态内存分配。当我们需要一个长度在运行时才能确定的数据类型(例如数组)时,动态分配内存是十分关键的。此外,合理使用内存分配可以减少程序运行时内存开销。

M-1 malloc()

malloc()在内存池中提取一块特定大小的内存,将内存的起始位置作为指针返回给调用者,以便于使用这块分配出来的内存。被分配出来的内存并未进行任何初始化。
malloc()的原型定义为void *malloc(size_t size);,它接受的参数是需要分配的字节数量,类型为size_t(此特殊类型也同样是在<stdlib.h>中被定义)。它的返回值类型是void *,这意味着往往需要显式地进行强制类型转换。
malloc()函数所分配的内存块是连续的。如果操作系统无法满足malloc()函数的需求,malloc()函数的返回值是NULL。所以使用malloc()返回的指针之前可能需要检查其是否为NULL

M-2 free()

free()函数原型定义为void free(void *pointer);。它接受一个指针作为参数,无返回值。此指针来源于malloc(或callocrealloc),free函数会释放先前释放的内存,这一片内存将会归操作系统管理。在这之后,原先指向新分配内存的指针将会变为野指针,因此最好重新赋值。

free()传递一个NULL指针不会有任何效果。向free函数传递一个并非由malloc()分配出来的指针,其结果是未定义的。

M-3 更多函数:calloc和realloc

callocrealloc是另外两个内存分配函数。
callocmalloc的作用相似,但是calloc在分配内存之前会先初始化为0。calloc的函数原型为void *calloc( size_t num_elements,size_t element_size);,它接受两个参数:元素的数量、单个元素的大小(字节数量)。calloc会自行计算总共需要分配的字节数量。
realloc函数用于修改已分配内存块的大小,原型为void realloc(void *ptr,size_t new_size);,将新分配的内存块添加到原先内存块的最后面,或者是重置该内存块尾部的部分内存。

M-4 使用分配的内存

由于malloc接受的参数即要分派的字节数量,因此可以直截了当地这样分配:array = malloc(100);但是这么做影响了程序的可移植性,在不同的机器上运行,你可能得到的是一个25个元素的数组,可能不是,取决于int占用的字。因此,使用sizeof()往往能提供更准确的实现。
下面的例子利用malloc分配内存,创建一个拥有5个元素的数组:

int *array,nvalues=5;
array = (int *)malloc(nvalues * sizeof(int));

在分配完成后,最好检查一下分配是否成功。如果malloc没能成功分配内存(一般情况下这不太可能发生),返回的指针值是NULL

if(array == NULL)
{
    printf("Error!Out of memory.");
    exit(1);
}

array接受一个指针值,类似于其他的数组名,可以像往常一样使用间接访问、指针运算、下标来访问其元素。

array[1] = 10;
printf("array[1] == %d\n",array[1]);
/*
*使用array[]
*/
free(array);
array = NULL;

本系列博客为我本人原创的学习笔记,尽量勤更新,如有错误欢迎各位大佬指出,Thanks♪(・ω・)ノ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值