我不理解为什麽要有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值前面已经确定啦,变长数组啊。。。。。
关于malloc函数的
答案:3 悬赏:60
解决时间 2021-12-31 04:36
- 提问者网友:相思瘸子
- 2021-12-30 09:04
最佳答案
- 二级知识专家网友:寂寞的炫耀
- 2021-12-30 09:40
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去堆里分配内存。就这样。
-------------------------------------------------------
好吧好吧。。对于常用编译器为不完美支持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来得方便。甚至连替代的可能都没有。
以上。。。临时就想到这么多了。。
全部回答
- 1楼网友:一只傻青衣
- 2021-12-30 11:18
malloc是动态分配,而定义方式是固定的分配,如果你生成exe文件后.固定就不能变化了,但动态分配可以根据用户输入数据随时增减
- 2楼网友:兮沫♡晨曦
- 2021-12-30 10:23
malloc是从堆(heap)里面分配内存,最后需要手动释放。
int num[max]; 分两种情况:
1.函数体外作为全局变量声明时,它的生命周期是伴随程序结束而结束的
2.函数体内作为局部变量,是在栈内分配内存的,函数结束它也就结束其生命了
在你这个问题内,
scanf("%d",&max);
int num[max];
可行吗?你定义数组还允许你设定该数组里面个数为一个变量?
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯