点击上方公众号关注,关注更多分享动态
✎ 编 者 悟 语当你因为一个轻微的借口而疲软的时候,问一下自己吧,这还是你吗?
文 章 导 读
今天给大家讲了下malloc、calloc、realloc三个内存分配相关的函数,并用代码进行了测试,希望能加深大家对它们的理解哈!
1malloc函数1)函数功能
为一个对象分配内存空间,该对象的大小由size指定,分配给对象的内存中的值是不确定的。
2)头文件
#include
3)函数原型
void *malloc(size_t size)
4)返回值
分配失败返回空指针,分配成功返回指向分配空间的指针。
2calloc函数1)函数功能
为nmemb个对象分配空间,每个对象占用空间的大小为size,分配空间的所有位都被初始化为零。
2)头文件
#include
3)函数原型
void *calloc(size_t nmemb,size_t size)
4)返回值
分配失败返回空指针,分配成功返回指向分配空间的指针。
3realloc函数1)函数功能
函数realloc将ptr指向的对象大小改为由newsize指定的大小。
它主要用于对已经分配的动态内存进行空间扩展。
如果有足够空间用于扩容的ptr指向的内存块,则分配额外内存,并返回ptr。
realloc是从堆上分配内存的,当扩容时,realloc试图直接从堆上现存的数据后面的获得附加的字节,如果原先的内存大小后面有足够的空间用来分配,加上原来的空间大小能等于newsize。就满足分配要求。
如果原先的内存大小后面没有足够的空间用来分配,那么从堆中另外找一块newsize大小的内存。并把原来大小内存空间中的内容复制到newsize中。返回新的ptr指向新的地址。
2)头文件
#include
3)函数原型
void *realloc(void *ptr,size_t newsize)
4)返回值
分配失败返回空指针,分配成功指向可能被移动了的分配空间的指针。
4malloc与calloc功能验证此实例代码对照malloc和calloc分配完空间后,里面的初始值情况。
验证代码如下。
#include
#include
int main()
{
int i,j, k,n;
int *a,*b,*c,*d;
// 测试calloc的初始值
a = (int*)calloc(3, sizeof(int));
printf("calloc的初始值:\n");
for( i=0 ; i < 3 ; i++ )
{
printf("%d\n",a[i]);
}
// 测试malloc的初始值
b = (int*)malloc(3*sizeof(int));
printf("\n未写0的malloc初始值:\n");
for( j=0 ; j < 3 ; j++ )
{
printf("%d\n",b[j]);
}
c = (int*)malloc(3*sizeof(int));
d = memset(c,0, 3*sizeof(int));
printf("\nmemset将malloc分配空间写0后的值:\n");
for( k=0 ; k < 3 ; k++ )
{
printf("%d\n",d[k]);
}
free(a); // 释放内存
free(b);
free(d);
return(0);
}
运行结果:
可以得出如下结论:
calloc初始值为0。
malloc初始值不确定,想要写0要配合memset函数来实现。
malloc + memset 在功能上是和calloc等价的,但在速度上calloc不如malloc和memset的组合,所以嵌入式领域一般使用malloc和memset组合来使分配的内存更有序。
5realloc功能验证此示例对比了realloc扩容后地址。
#include
#include
int main(int argc, char *argv[])
{
const int size = 100;
int *p1 = (int *)malloc(10*sizeof(int));
if(p1)
{
printf("p1内存分配成功!\n");
}
else
{
printf("p1内存分配失败!\n");
}
int *p2 = (int *)realloc(p1, size*sizeof(int));
if(p1)
{
printf("p2内存分配成功!\n");
}
else
{
printf("p2内存分配失败!\n");
}
printf("\n原来分配空间的返回地址:%d\n", p1);
printf("\n空间扩容之后返回的地址:%d\n", p2);
free(p2);
return 0;
}
运行结果如下。
可以看到分配地址变了。
调试中发现,当size取1-8时地址不变,大于9地址就会变化,这个现象需要继续探究哈!
总结
今天给大家讲解了三个内存分配函数的功能及使用方法,希望能对大家有所帮助,后面还会有C语言相关的内容,大家拭目以待哈,。
有问题可以后台留言交流,公众号18年后新申请的,文章后不支持留言功能的。
相关文章:
static关键字的3种特性
用结构体和指针模拟配置芯片引脚输出高低电平
C标准库函数sprintf和sscanf的使用
用Dev-C++生成dll动态链接库文件并用C代码调用
宏分类的妙用(排版开始用模板)
进化论——从函数指针到被结构封装的函数指针及参数的应用举例
专辑推荐:
Python技能专辑
C语言专辑
IDE调试专辑
软件推荐专辑
软实力专辑
扫码关注我们
❖ Game Over!