C语言中动态内存分配函数的用法及作用?(比如malloc,calloc,realloc等)

C语言中动态内存分配函数的用法及作用?(比如malloc,calloc,realloc等),第1张

先举个例子:某用户需要一个将任意多个整数按大小排序的程序。(在计算机文件夹中,当文件很多时经常用到排序)

1。若不用动态分配内存,那就定义一个超大的数组吧!问题是,如果用户不需要那么大,不就浪费了?如果定义的数组还不够大,不就不能满足需求了?

2。如果用动态分配,就解决上述问题了。当你需要多大内存时,就给你多大——如果有的话——这就是动态分配的意义。

现在看上述问题的代码,我调试过的:

----------------------------------------------------------------------

#include <stdioh>

#include <stdlibh> / calloc、exit需要声明头文件 /

void main()

{

int n,p,i,j,m;

printf("本程序可对任意个整数排序;\n");

printf("请输入整数的总个数: ");

scanf("%d",&n);

p=(int )calloc(n,sizeof(int)); / calloc函数的使用 /

if(p==0) {

printf("分配失败!\n");

exit(1); / 当分配失败时,exit可以终止程序 /

}

printf("请输入这些整数:\n");

for(i=0;i<n;i++)

scanf("%d",p+i); / 利用指针移位的方法赋值 /

for(i=1;i<n;i++) / 冒泡排序法 /

{

for(j=0;j<n-i;j++)

if((p+j)>(p+j+1))

{

m=(p+j);

(p+j)=(p+j+1);

(p+j+1)=m;

}

}

printf("将这些整数从小到大排列输出为:");

for(i=0;i<n;i++)

{

if(i%5==0) printf("\n"); / 每隔5个数换行 /

printf(" %11d;",(p+i));

/ 为了整齐,每个数占11个字符,当数字很多时这很重要 /

}

printf("\n");

free(p); / 释放空间 /

}

----------------------------------------------------------------------

调用calloc函数时,calloc(n,sizeof(int))表示请求n个连续的、每个长度为整型的空间,若成功返回这些空间的首地址。(int )表示将这个地址放在指针中。到此为止,就可以用指针来对分配到的空间 *** 作了。注意,最后一定要用free函数释放申请到的空间,否则这部分空间会一直占着。

malloc、calloc、realloc的用法(以上述问题为例)及区别:

1。malloc(nsizeof(int)) / 请求n个连续的、每个长度为整型的空间,若成功返回这些空间的首地址,失败返回0 /

2。calloc(n,sizeof(int)) / 请求n个连续的、每个长度为整型的空间,若成功返回这些空间的首地址并将每个空间赋值为0,失败返回0 /

3。realloc(p,sizeof(int)n) / 给一个已经分配了地址的指针重新分配空间,参数p为原有的空间地址,sizeof(int)n是重新申请的地址长度,用于分配不足的时候。个人觉得没用——不够就找到原分配处改大一点不就行了?! /

我能说得只有这些了,有些东西看起来麻烦,当你小试一下就会发现,不过如此嘛!学C要多练、多思,不怕麻烦。不知道您学了递归没有?有个经典的“汉诺塔”问题,那家伙——得整死人啊!到现在我还一知半解的……

希望我的回答对您有帮助!

在程序中使用free释放,否则该段内存不会被释放掉。

C语言不会释放。所谓动态内存,是由malloc系列函数进行申请的内存,除非在程序中使用free释放,否则该段内存不会被释放掉。

标准库中malloc函数的实现原理。要了解针对malloc的内存存储结构,malloc不像全局变量一样,不是在编译器编译的时候就会分配内存空间,而是在调用到malloc函数时才会分配空间。有时还会中途调用free函数释放空间出来。

扩展资料

free:释放malloc分配的存储空间

malloc用于向系统申请一定数量的内存,如果你的程序一味的申请内存供自己使用,那么系统可分配给其它程序的内存就会减少,到最后无内存可用,最终导致系统运行缓慢,不稳定等问题。显然,这种只索取不奉献的行为是不可取的因此,C语言提供了free函数,用于向系统返还借用的内存。

当忘记使用free释放由malloc分配的内存时,表明程序存在”内存泄露“这一顽疾,因此对于上面的程序,在return 0之前,使用下面的代码进行完善。

—c语言

#include <stdioh>

#include <stdlibh>

unsigned int calc_align(unsigned int n,unsigned align)

{

    return ((n + align - 1) & (~(align - 1)));

}

void  my_malloc(int size) {

    void p;

    if(size <= 0) size = 4096;

    else

    size =calc_align(size, 4096);

    p = malloc(size);

    return p;

}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12155486.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存