【嵌入式】Linux C编程——内存管理

数据在内存中的位置:

1、未初始化的全局变量:

未初始化的和初始化为0的全局变量全放在.bss段中。
bss类型的全局变量只占用运行时的内存空间,而不占用文件空间。在整个程序的运行周期内,bss数据是一直存在的。

2、初始化过的全局变量:

初始化为非零的全局变量存放在.data段内。
data类型的全局变量即占用文件空间,又占用运行时的内存空间。在整个程序的运行周期内,data数据一直存在。

3、常量数据:

常量数据通常放在.rodata内。

关于rodata数据,需要注意一下几点:

①、常量不一定存放在rodata里,有的立即数直接和指令编码在一起存放在代码段内;
②、对于字符串常量,编译器会自动去掉重复的字符串,保证一个字符串在一个可执行文件中只存在一份复制;
③、rodata在多个进程间是共享的,这样可以提高运行空间的利用率;
④、在有的嵌入式系统中,rodata放在ROM里,运行时直接读取,无需加载到RAM中;
⑤、在Linux中,可以通过XIP(就地执行)的技术,直接读取,无需加载到RAM中;
⑥、常量是不能修改的,修改常量在Linux下会出现错误。
由于rodata在只读的内存页面中,是受到保护的。任何试图对它的修改都会被及时发现,这样可以提高程序的稳定性。

4、代码段:

.text段用来存放代码(函数)和部分整数常量。

5、栈:

栈(stack)用于存放临时变量和函数参数。在通常情况下,栈向下(低地址)增长,每向栈中PUSH一个元素,栈顶就向低地址扩展,每从栈中POP一个元素,栈顶就向高地址回退。

6、堆:

堆是最灵活的内存,其生命周期完全由使用者控制。
标准C语言提供三个函数:

malloc:用来分配一块指定大小的内存;
realloc:用来调整/重分配一块存在的内存;
free:用来释放不再使用的内存。

使用堆时需要注意,malloc/free要配对使用。内存分配之后不释放称为内存泄漏,内存泄漏多了会造成“out of memory”的错误,再分配内存就会失败。
读写操作要在分配的内存范围之内,读多了就会读到随机的数据,写操作多了就会产生随机破坏,这两种情况被称为缓冲溢出。

内存的分配方式:

1、从静态存储区分配:内存在编译时就分配完成,这块内存在整个程序运行期间都存在;
2、在栈上创建:在执行函数时,函数内的局部变量的存储单元都可以在栈上创建,函数执行结束时自动释放这些单元;
3、从堆上分配(动态内存分配):程序在运行时通过malloc和free等申请和释放内存,由程序员自己负责。

野指针:

野指针不是NULL指针,是指向“垃圾”内存的指针。

造成野指针的两种原因:

1、指针变量没有被初始化。任何指针变量在刚被创建的时候不会自动称为NULL指针,它的默认值是随机的,需要在创建时被初始化或者将指针设置为NULL;
2、指针被free或者delete之后,没有设置为NULL。free和delete只是将指针所指的内存释放掉,并没有将指针本身删除掉。

你可能感兴趣的:(Linux,C编程,linux,c语言,开发语言)