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

2019-08-20 15:19发布


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

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

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

请大神指点,或者如何解决这样可能发生的问题
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
yyx112358
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容易造成内存碎片,所以少用为好。

一周热门 更多>