c语言分配函数教程 c语言函数怎么使用( 三 )


?'>C语言中的malloc函数用法>?C语言中malloc是动态内存分配函数 。
函数原型:void *malloc(unsigned int num_bytes) 。
参数:num_bytes 是无符号整型,用于表示分配的字节数 。
注意:当内存不再使用时,应使用free()函数将内存块释放 。函数返回的指针一定要适当对齐,使其可以用于任何数据对象 。关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换 。
实现malloc的方法:
首先我们要确定所采用的数据结构 。一个简单可行方案是将堆内存空间以块的形式组织起来,每个块由meta区和数据区组成,meta区记录数据块的元信息(数据区大小、空闲标志位、指针等等) 。
数据区是真实分配的内存区域,并且数据区的第一个字节地址即为malloc返回的地址。
C语言中动态内存分配函数的用法及作用?(比如malloc,calloc,realloc等)先举个例子:某用户需要一个将任意多个整数按大小排序的程序 。(在计算机文件夹中c语言分配函数教程 , 当文件很多时经常用到排序)
1 。若不用动态分配内存,那就定义一个超大的数组吧!问题是,如果用户不需要那么大,不就浪费c语言分配函数教程了?如果定义的数组还不够大,不就不能满足需求了?
2 。如果用动态分配,就解决上述问题了 。当你需要多大内存时,就给你多大——如果有的话——这就是动态分配的意义 。
现在看上述问题的代码 , 我调试过的:
----------------------------------------------------------------------
#include stdio.h
#include stdlib.h/* 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;in;i++)
scanf("%d",p+i);/* 利用指针移位的方法赋值 */
for(i=1;in;i++)/* 冒泡排序法 */
{
for(j=0;jn-i;j++)
if(*(p+j)*(p+j+1))
{
m=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=m;
}
}
printf("将这些整数从小到大排列输出为:");
for(i=0;in;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(n*sizeof(int)) /* 请求n个连续的、每个长度为整型的空间,若成功返回这些空间的首地址,失败返回0 */
2 。calloc(n,sizeof(int)) /* 请求n个连续的、每个长度为整型的空间,若成功返回这些空间的首地址并将每个空间赋值为0 , 失败返回0 */
3 。realloc(p,sizeof(int)*n) /* 给一个已经分配了地址的指针重新分配空间,参数p为原有的空间地址,sizeof(int)*n是重新申请的地址长度,用于分配不足的时候 。个人觉得没用——不够就找到原分配处改大一点不就行了?! */

推荐阅读