中易网

关于malloc函数的

答案:3  悬赏:60  
解决时间 2021-12-31 04:36
我不理解为什麽要有malloc函数

比如:

int *num;
printf();
scanf("%d",&max);
num=(int*)malloc(max*sizeof(int));
free(num);

用这个就行啦
printf();
scanf("%d",&max);
int num[max]; //malloc()到底有什麽特别之处???????

不可能,有vla数组,声明可以在任何地方

int num[max]; 完全可行啊,max值前面已经确定啦,变长数组啊。。。。。
最佳答案
int num[max] 不能成立。。
没有动态数组一说。定义数组的时候数组维数必须是常量。

malloc去堆里分配内存。就这样。

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

好吧好吧。。对于常用编译器为不完美支持C/C++特性的cl.exe的我们来说VLA的确不在考虑范围内。。。。于是。。g++处理VLA的时候只是简单地把ESP下移,没有长度检测,所以会有可能造成stack overflow 。 然后就是数组的内存分配在stack里,new/malloc的内存分配在heap里。。所以,malloc来的内存调用时多了一条mov指令:
new来的内存:*p = 0 ;的实现:
mov ecx,dword ptr [ebp-4]
mov dword ptr [ecx],0
直接用数组:pp[0]=0 ;的实现:
mov dword ptr [ebp-194h],0
所以会造成执行速度上的差异。

至于malloc存在的意义问题,正如楼上所说,必须手释放。换句话说,就是内存块的生存周期自行控制。。想一下一些成套的API函数。。。。呃。你用的支持VLA的编译器,那么也许你不在windows环境下吧。。。那想象一下socket程序。。当你调用socket()函数得到一个SOCKET之后,与这个SOCKET相关的一些对象,直到你调用了closesocket()函数才会被释放掉。。那么这个生存周期,VLA
就有些难以控制。

然后,链表。除去简单的单向双向链表外,其它稍复杂一些的结构,比如树状结构,就是VLA难以实现的。

再者,VLA所谓的变长,只是编译期可变,不是运行期可变。就是说,一个VLA,一旦定义它的大小之后,就再也不能改变。。那么遇到一些需要频繁改变长度的场合,VLA就明显不如可以自行控制生存周期的malloc来得方便。甚至连替代的可能都没有。

以上。。。临时就想到这么多了。。
全部回答

malloc是动态分配,而定义方式是固定的分配,如果你生成exe文件后.固定就不能变化了,但动态分配可以根据用户输入数据随时增减

malloc是从堆(heap)里面分配内存,最后需要手动释放。 int num[max]; 分两种情况: 1.函数体外作为全局变量声明时,它的生命周期是伴随程序结束而结束的 2.函数体内作为局部变量,是在栈内分配内存的,函数结束它也就结束其生命了 在你这个问题内, scanf("%d",&max); int num[max]; 可行吗?你定义数组还允许你设定该数组里面个数为一个变量?
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
mac mini内存条是否可以用在笔记本上
报德的意思是什么啊?请解释下!
色弱能不能报计算机网络技术,计算机信息管理
山顶和山谷白天温度 夜晚温度是怎样的
财务人员代编制审计工作底稿
武汉周边武昌周边便宜的会议场地场所?江夏的
我想问问卫生间吊顶造型选择什么材料才比较好
跟腱断裂后伤腿是不是会缩短啊?高人指点!~~
单眼皮 用什么眼线笔不晕染
中国移动n1 max能不能插联通卡?能不能用联通
在东莞什么工厂不加班
伊莲娜有过几个男友
用简便方法计算18*99-18
证明三角函数的数学题
天龙八部中,武当派应该拿什么神器?
推荐资讯
老北京布鞋是不是真的可以达到养生保健的效果
哪个女星名字里有路这个字
且住的意思是什么啊?请解释下!
为什么总觉得很累很失心的感觉,好象做什么事
升晖驾校(黄山祁门县)地址有知道的么?有点事
我要寄送一个背包去台湾,但没有发票怎么办
求高人指点,注册电气工程师,基础考试报名要
你好,我想问一下我买了一个万能电视遥控器买
足纹的意思是什么啊?请解释下!
21~27度穿什么好
验算加法时,可以用和减()来验算,也可以用
7.《米莉茉莉丛书》是吉尔•比特专为4~
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?