内存管理和系统分配内存是否冲突

2019-08-20 15:19发布


看了原子哥的内存管理实验我不禁有个疑惑:

系统给每个函数或者程序中的变量分配内存,还有我们自己定义的结构体都是需要内存的,系统是怎么给他们分配内存的,或者说分配到了什么地方,然后就是原子哥的内存管理实验,把全部的内存(单片机的和外扩的)都划分到了内存管理里面了,

这是不是会有冲突?覆盖?毕竟内存是绝对的!

请大神指点,或者如何解决这样可能发生的问题
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
yyx112358
1楼-- · 2019-08-20 16:33
参考C语言的内存分配。抄一段下来:
BSS段:在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。
•数据段:在采用段式内存管理的架构中,数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。
•代码段:在采用段式内存管理的架构中,代码段(text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域属于只读。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

程序编译后生成的目标文件至少含有这三个段,这三个段的大致结构图如下所示:

其中.text即为代码段,为只读。.bss段包含程序中未初始化的全局变量和static变量。data段包含三个部分:heap(堆)、stack(栈)和静态数据区。
•堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
•栈 (stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变 量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以 栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

当程序在执行时动态分配空间(C中的malloc函数),所分配的空间就属于heap。其概念与数据结构中“堆”的概念不同。

stack段存放函数内部的变量、参数和返回地址,其在函数被调用时自动分配,访问方式就是标准栈中的LIFO方式。(因为函数的局部变量存放在此,因此其访问方式应该是栈指针加偏移的方式,否则若通过push、pop操作来访问相当麻烦)

data段中的静态数据区存放的是程序中已初始化的全局变量、静态变量和常量。


所以,malloc函数分配的空间在堆HEAP当中,而mymalloc函数是先定义了一个大数组(很大,但是看清楚哦,没有使用全部内存,如果发生重叠编译器会出现ERROR)作为待分配区来进行分配的。C编译器会管理这些内存,所以不必担心重叠,尽可大胆去用。
还有就是malloc容易造成内存碎片,所以少用为好。
taizonglai
2楼-- · 2019-08-20 19:11
绝对不会冲突。内存管理实验都是定义了一个很大的数组,还有你代码中定义的什么结构体,数组这些东西在编译代码的时候编译器都已经给你分配好了。
liuchang
3楼-- · 2019-08-20 23:27
 精彩回答 2  元偷偷看……
feifei130
4楼-- · 2019-08-21 00:01
zuozhongkai 发表于 2016-7-11 12:19
绝对不会冲突。内存管理实验都是定义了一个很大的数组,还有你代码中定义的什么结构体,数组这些东西在编译 ...

你可能理解错我的意思了,我想说的是用这样的内存管理软件(malloc)定义了绝对地址,而且还把整个单片机的内存都涵盖在里面了,我要是定义了结构体,变量,或者全局变量,那么系统(keil软件)在编译时给他们指定的内存我想肯定会有重叠,不管是否重叠,我想知道该如何处理。我在使用malloc时怎么手动分配内存,以保证他们不会重叠。
jermy_z
5楼-- · 2019-08-21 03:12
feifei130 发表于 2016-7-11 14:00
你可能理解错我的意思了,我想说的是用这样的内存管理软件(malloc)定义了绝对地址,而且还把整个单片机 ...

malloc是在已经定义的数组里进行分配的
yyx112358
6楼-- · 2019-08-21 04:20
liuchang 发表于 2016-7-11 13:25
小弟也有个疑问,代码中有强制将数组的地址置于某个绝对地址,例如里面用到attribute...at()...
我也想 ...

编译器会自动管理,不必担心。即使发生重叠也会生成ERROR提示

一周热门 更多>