C语言中动态内存分配函数的用法及作用?(比如malloc,calloc,realloc等)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中动态内存分配函数的用法及作用?(比如malloc,calloc,realloc等)相关的知识,希望对你有一定的参考价值。
我是个C的初学者,专业是嵌入式方向,但目前还没有学嵌入式,想自己把C学深入。
不知道这个动态内存是什么意思? 有什么作用?
还有就是malloc,calloc,realloc这几个函数的用法及意义,最好能举个例子哈,网上官方的例子和解释就不要复制了,我看了很多了,不怎么看得懂,要是加上一些人情注释就更感谢了。
这么再给大家说一下吧:我现在不明白C语言中动态内存分配的意义和作用,计算机不是自动分配内存的吗?其次才是那几个动态内存分配函数的用法。 谢谢各位了! 回答好了加分,我这里分足
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要多练、多思,不怕麻烦。不知道您学了递归没有?有个经典的“汉诺塔”问题,那家伙——得整死人啊!到现在我还一知半解的……
希望我的回答对您有帮助! 参考技术A 根据使用函数不同,作用各不相同。共同点均是动态分配一段内存,使用后需要用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()函数将内存块释放。 参考技术B 你还是自己查看下malloc()的原函数吧,可能理解好点 参考技术C 动态内存分配是用于处理预先不知道数据量大小的问题 参考技术D 还是多看看书吧~估计解释了你也不会明白
动态内存分配
动态内存分配
在c语言中,我们有malloc。 在C++ 中,我们用new。这种分配方式更、省、内、存!
第一种用法:
分配一个变量。
P = new T;
在这里,P是一个类型为 *T 的指针,T代表一个类型的名字。这句话的作用就是动态分配出一片大小为 sizeof ( T ) 字节的
内存空间。并将该内存空间的起始地址赋值给P。
举个栗子:
int *pn ;
pn = new int ;
*pn = 5 ;
第二种用法:
分配一个数组。
P = new T [N] ;
(历史总是惊人地相似) 同样的,T为任意类型名。 P是一个类型为T的指针。
不同的:N是要分配的数组元素的个数。 可以是整形表达式哦~~ 。
它的作用:动态分配出一片大小为 N sizeof ( T ) 字节的内存空间,并将该内存空间的起始地址赋值给P。
举个栗子:
int *pn;
int i = 5 ;
pn = new int [ i * 20 ];
pn [0] = 20;
pn [100] = 30;//这句话的话,编译没问题,运行会RTE *数组越界。 因为他只申请了100个空间,在第pn[99]是最后一个
2
这个动态空间先申请,然后用。但用完了之后也不能不去管它。用完后必须把它释放掉。这时,就轮到我们的 delete 函数出场。如果不释放,你占用的空间就一直在那里。最要命的一点事,别的程序无法使用它。如果你一直申请下去,一直不释放,那你就刺激了。最终有可能导致操作系统的内存空间不够用。你系统就这么炸了。
写法:
delete +指针 // 指针必须指向动态分配的空间
具体的例子:
int *P= new int;
* p = 5;
delete p;//到此,一切正常
delete p;//注意:释放操作只能做一次,这句话很可能导致你的程序异常。
以上是关于C语言中动态内存分配函数的用法及作用?(比如malloc,calloc,realloc等)的主要内容,如果未能解决你的问题,请参考以下文章