c malloc 头文件_内存分配函数malloc、calloc、realloc的功能测试

点击上方公众号关注,关注更多分享动态

2e9fa772efd056f505a754297322ae74.gif ✎ 编 者 悟 语

        当你因为一个轻微的借口而疲软的时候,问一下自己吧,这还是你吗?

文 章 导 读

    今天给大家讲了下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);

}

    运行结果:

9f17364ba3e3fed04d30e1a761577456.png

    可以得出如下结论:

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;

}

    运行结果如下。

f0655411ac3717e71d2acf26c1592869.png

    可以看到分配地址变了。

    调试中发现,当size取1-8时地址不变,大于9地址就会变化,这个现象需要继续探究哈!

总结

    今天给大家讲解了三个内存分配函数的功能及使用方法,希望能对大家有所帮助,后面还会有C语言相关的内容,大家拭目以待哈,826121ef77ae2704d8d56ae3a2867bb8.png

    有问题可以后台留言交流,公众号18年后新申请的,文章后不支持留言功能的。

相关文章:

static关键字的3种特性

用结构体和指针模拟配置芯片引脚输出高低电平

C标准库函数sprintf和sscanf的使用

用Dev-C++生成dll动态链接库文件并用C代码调用

宏分类的妙用(排版开始用模板)

进化论——从函数指针到被结构封装的函数指针及参数的应用举例

专辑推荐:

Python技能专辑

C语言专辑

IDE调试专辑

软件推荐专辑

软实力专辑

扫码关注我们

3f4fb5d734a4f91cb690b199d7dd1aeb.png

08894f0057db640e3b488ca1e1f90d0a.gif Game Over!
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值