C语言中动态内存分配函数的用法及作用?(比如malloc,calloc,realloc等)
一般申请大的内存时使用:
char
*string;
string
=
(char
*)malloc(256);
//申请256字节的字符串
free(string);
//用完后记得释放内存
=======
string
=
(char
*)malloc(128);
str
=
realloc(string,
256);
//128太小,重新申请256大小。
这些用法可以搜索“C库函数大全”,里面有各种库函数的详细用法和举例
再看看别人怎么说的。
malloc应该就是memory allocate
realloc就是加个re前缀
calloc有人说是complex也有说是clear的,与malloc区别就是多了清0操作
1。若不用动态分配内存,那就定义一个超大的数组吧!问题是,如果用户不需要那么大,不就浪费了?如果定义的数组还不够大,不就不能满足需求了?
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;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(n*sizeof(int)) /* 请求n个连续的、每个长度为整型的空间,若成功返回这些空间的首地址,失败返回0 */
2。calloc(n,sizeof(int)) /* 请求n个连续的、每个长度为整型的空间,若成功返回这些空间的首地址并将每个空间赋值为0,失败返回0 */
3。realloc(p,sizeof(int)*n) /* 给一个已经分配了地址的指针重新分配空间,参数p为原有的空间地址,sizeof(int)*n是重新申请的地址长度,用于分配不足的时候。个人觉得没用——不够就找到原分配处改大一点不就行了?! */
我能说得只有这些了,有些东西看起来麻烦,当你小试一下就会发现,不过如此嘛!学C要多练、多思,不怕麻烦。不知道您学了递归没有?有个经典的“汉诺塔”问题,那家伙——得整死人啊!到现在我还一知半解的……
希望我的回答对您有帮助!
根据使用函数不同,作用各不相同。共同点均是动态分配一段内存,使用后需要用free函数释放。所有动态分配函数均声明在stdlib.h中。
1 malloc
void *malloc(unsigned int num_bytes);
功能
分配长度为num_bytes字节的内存块
返回值
如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。
说明
关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。
2 calloc
void *calloc(size_t n, size_t size);
在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。
calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。
3 realloc
void *realloc(void *mem_address, unsigned int newsize);
功能
先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。
返回值
如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
注意
当内存不再使用时,应使用free()函数将内存块释放。
你还是自己查看下malloc()的原函数吧,可能理解好点
动态内存分配是用于处理预先不知道数据量大小的问题
还是多看看书吧~估计解释了你也不会明白
C语言中动态内存分配函数的用法及作用?(比如malloc,calloc,realloc等...
先举个例子:某用户需要一个将任意多个整数按大小排序的程序。(在计算机文件夹中,当文件很多时经常用到排序)1。若不用动态分配内存,那就定义一个超大的数组吧!问题是,如果用户不需要那么大,不就浪费了?如果定义的数组还不够大,不就不能满足需求了?2。如果用动态分配,就解决上述问题了。当...
C语言中的malloc函数的使用?
1.没有错误.不过分配了就要赋给某个指针,不然,这块内存就memory leak了.int *ptr = (int *)malloc(5*sizeof(int));2.是5个连续的int型大小的内存,和int a[5]不一样.因为类型不一样.但其在内存表示上是一样的,都是5个Int型空间....
c语言堆和栈的区别
内存分配中的堆和栈 在 C 语言中,内存分配方式不外乎有如下三种形式:从静态存储区域分配:它是由编译器自动分配和释放的,即内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,直到整个程序运行结束时才被释放,如全局变量与 static 变量。在栈上分配:它同样也是由编译器自动...
C语言动态内存函数分配问题
需要先找到队伍的领头人,领头的人只在你申请的时候出现一次,后面,你就找不到他了,怎么办?你把他电话给P吧,P可以找到他。呵呵。如果还是不理解,那就不要理解了,建议去吧队列的方式,用指针和动态分配内存的方式实现一次,就知道了,不能照着书本抄,全部代码要自己写出来,就肯定理解了。
C语言:都是动态分配内存,malloc和new有什么区别?malloc分配的内存是...
malloc是C语言的分配内存接口,new操作会在分配内存的情况下再调用构造函数对内存块进行初始化,malloc和new都是从堆中分配内存,所以都不能保证分配的内存是连续的。
c语言什么时候需要动态分配内存?
当你不确定内存空间大小的时候。。有2种办法。1。预先定义一个足够大的空间。(这个比较浪费资源。而且随着程序的使用推广。预先定义的空间也不一定能完全满足条件)2。动态的分配内存。可以做到准确分配空间大小。不浪费资源,而且也不会发生程序不断使用预先分配内存不足。备注:动态分配的内存空间系统不...
C语言动态内存释放这个free(p);到底是释放的是第一个单元的空间还是释放...
free()释放的是指针指向的内存,不单单是首地址单元,包括所有动态分配的 另外注意释放的是内存不是指针 指针是一个变量,只有程序结束时才被销毁 释放了内存空间后,原来指向这块空间的指针还存在,只不过现在指针指向的内容是未定义的,是垃圾
c语言常量变量在内存中的存储方式
在栈上创建(地址从大到小):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。(栈上的变量都具有临时变量的特性)从堆上分配(地址从小到大):亦称动态内存分配。程序在运行...
C++\/C 内存分配-malloc\/mmap\/syscall深度解析以及性能测试
对于内存分配的性能,通常需要考虑以下几个方面:尝试分析小块内存申请情况 代码如下:运行结果如下:第一次打印的结果:第二次打印的结果:根据这些数据,我们可以初步分析内存碎片的情况:malloc和free是C语言库函数,而在C++中常用的是new和delete,C里面是用malloc_stats();而C++则需要用\/proc\/self\/...
C语言中对一个定义一个变量就是为其在内存中分配一个空间,那个空间最开 ...
到运行时才为其分配地址的,就分配到栈地址区域;三:堆式存储分配,堆由大片可利用块或空闲块组成,堆中的内存可以按任意顺序分配和释放。在程序编译无法确定数据块大小时(如可变长度的字符串),可在堆中分配内存空间;C语言在运行时进行的动态内存分配都是在堆中进行的 ...
蠹柿曲咪: 1、malloc函数:其作用是在内存的动态存储区中分配一个长度为size的连续空间.其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针. 2、free函数:由于内存区域总是有限的,不能不限制地分配下去,而且...
吐鲁番市17632198269: C语言中malloc函数的使用方法 - ?
蠹柿曲咪: C语言中malloc是动态内存分配函数. 函数原型:void *malloc(unsigned int num_bytes); 参数:num_bytes 是无符号整型,用于表示分配的字节数. 返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返...
吐鲁番市17632198269: 如何用C语言编写动态分配内存的函数 - ?
蠹柿曲咪: #include <stdio.h>void main() {int *p;p=new int;*p=3;printf("%d\n",*p);delete p; }
吐鲁番市17632198269: C语言中动态内存分配函数的用法及作用?(比如malloc,calloc,realloc等) - ?
蠹柿曲咪: 先举个例子:某用户需要一个将任意多个整数按大小排序的程序.(在计算机文件夹中,当文件很多时经常用到排序) 1.若不用动态分配内存,那就定义一个超大的数组吧!问题是,如果用户不需要那么大,不就浪费了?如果定义的数组还不...
吐鲁番市17632198269: C语言中分配内存 - ?
蠹柿曲咪: 要实现根据程序的需要动态分配存储空间,就必须用到以下几个函数 1、malloc函数 malloc函数的原型为:void *malloc (u igned int size) 其作用是在内存的动态存储区中分配一个长度为size的连续空间.其参数是一个无符号整形数,返...
吐鲁番市17632198269: c语言中,动态内存分配有什么用.. - ?
蠹柿曲咪: 可以提高内存的利用率,而不至于浪费多的内存.
吐鲁番市17632198269: c语言中什么是动态分配内存? - ?
蠹柿曲咪: c语言用函数malloc动态分配内存的,要用到指针,释放内存是free指针 malloc 原型:extern void *malloc(unsigned int num_bytes); 用法:#include <malloc.h> 或#include<stdlib.h> 功能:用于向内存申请空间,分配长度为num_bytes字节的内存...
吐鲁番市17632198269: C语言动态内存分配 - ?
蠹柿曲咪: 数组定义:int *f; 分配内存:f=malloc(n*sizeof(int));//n是数组长度 赋值:for(i=0;i<=n-1;i++)cin>>f[i]; 重新分配内存:f=realloc(f,m*sizeof(int));//m是新的数组长度
吐鲁番市17632198269: c语言程序怎么实现动态内存分配? - ?
蠹柿曲咪: 一、原型:extern void *malloc(unsigned int num_bytes); 头文件:#include功能:分配长度为num_bytes字节的内存块 说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL.当内存不再使用时,应使用free()函数将内存...
吐鲁番市17632198269: C语言:动态内存分配 - ?
蠹柿曲咪: 1.p1=(int *)malloc(10*sizeof(int)); //malloc 函数将会在动态存储区中分配一个长度为 10*sizeof(int)的 <连续> 空间. 而且p1的值是 分配域的起始地址;这就有一点像数组名了.2.例如 int temp[10]; int *ptemp; ptemp=temp; //得到数组的首地址.这样 ptemp 就可以 引用 数组的元素了.比如 ptemp[i]; 当然 这是 固定分配内存的.3.scanf("%d",&p1[btc]); 和 printf("%d",p1[btc]); 这两个函数 中 p1 的作用 就 是相当于数组名. 引用动态的数组.