先举个例子:某用户需要一个将任意多个整数按大小排序的程序。(在计算机文件夹中,当文件很多时经常用到排序)
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;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)