为什么要使用 malloc()是动态内存分配函数?

2019-07-16 07:55发布

1、相对于自动分配内存,malloc()函数申请分配的内存地址有什么不同?比如:
int x[100]
int * x = (int *)malloc(100 *sizeof(int))
二者之间的内存地址有什么区别?求教,谢谢


2、C语言什么情况下需要用malloc来申请内存?求教,谢谢

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
zhifubao
1楼-- · 2019-07-16 09:13
一般ARM程序的RAM分为堆区、栈区、全局变量区,int * x = (int *)malloc(100 *sizeof(int))使用的堆区,int x[100] 如果是局部变量则使用栈区,如果是全局变量则使用全局变量区。
malloc这个函数作用是在堆区分配一个连续空间,可用来存放一些临时用的数据。需要时开辟,不需要时释放。
Ansersion
2楼-- · 2019-07-16 14:04
本帖最后由 Ansersion 于 2018-6-26 23:03 编辑

就32位linux举例,系统启动之后就会在其0x00000000-0xFFFFFFFF地址空间留有一部分空间作为“堆”供程序动态申请。
这部分空间的最重要的特点是:大。
之所以说大:是相对于”栈“来说的。每个任务在创建之初都会分配一小点空间,你平时随便”int x; int i;“消耗的就是”栈“,显然我们不能直接就给一个任务1G的空间,那么别的任务吃啥呢?所以一般栈都比较小,根据系统配置而定。

其他系统,包括各种rtos也是一样的道理,虽然它们的内存普遍比较小,纵使是32位芯片,也没4G那么大的内存,但是”栈“和”堆“的设置是一样的原理。更小的系统完全可以不用动态分配内存,而且往往更稳定,毕竟操作内存是件费时而且容易出错的事情
内存分布.PNG
18842697583
3楼-- · 2019-07-16 16:05
自己的理解,供题主参考:
1、int x[] ,分配给x的内存空间是不可变的,大小不可变,也不能删除,要想删除只能改程序重新编译。
     malloc(sizeof(x)),   系统分配的这个内存空间大小可变,不用的时候回收。
2、用处:1的对比可以看到,malloc 和 动态的,灵活的。可变的 相关。
     我们可以假设这样一个例子,你的程序中 x[ ] 用来存储 你仓库中的零件,元素是零件种类 type。
     a.用int x[100],type只能有100种,等你有800种零件的时候怎么办?改程序,把100改成800.
        那你说,我开始就让 type 是1000。行是行,浪费资源。假设你只有有限的ram,你就要吝啬一些。
     b. 用malloc(sizeof(*x)), 这种情况下你就不用预先设置type的上限值了。你type是多少,都能保证,x能分配到合适的内
        存空间。  (实际上  int x[100] 也是做分配内存的操作对吧)
    说的不严谨的地方还请指正。
STC9051MCU
4楼-- · 2019-07-16 18:20
 精彩回答 2  元偷偷看……
liujinyi016
5楼-- · 2019-07-16 19:14
当你使用的内存的大小水确定时,要进行动态分配,否则分配大了就浪费了

一周热门 更多>