linux c基础------内存管理

本文深入解析不同内存段的用途:.bss段存放未初始化全局变量;.data段存放已初始化全局变量;.rodata段存储常量数据,支持多进程共享;.text段存放程序代码,具有只读特性;栈管理函数调用时的临时变量;堆由malloc等动态分配。文章还探讨了内存分配方式、常见错误及调试技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据存放位置

未初始化的全局变量 .bss段

存放没有初始化或初始化为0的全局变量
不占文件空间,只占运行内存

初始化过的全局变量 .data段

初始化非零的全局变量
既占文件空间,又占运行内存。

常量数据 .rodata段
  • 多个进程间共享
  • 删除重复的字符串
  • 一部分嵌入式系统中,rodata 放在 ROM 或 NOR Flash中,运行时直接加载到RAM内存中
  • 在嵌入式中,可以用XIP(就地执行),无需加载到RAM内存中
  • 常量不可修改
代码 .text段

存放程序执行代码,内存区域属于只读。也有可能包含一些只读的常数变量,例如字符串常量等。

管理函数调用时的临时变量,存放在栈中的数据只在当前函数和下一层函数中有效,一旦函数返回了,数据就自动释放了。

  • malloc 用来分配一块指定大小的内存
  • realloc 用来调整/重分配一块存在的内存
  • free 释放内存

1.malloc/free 配对使用
2.每个区间有四个属性,rwx三个属性和p/s(表示是否为共享内存)

内存空间属性
.bss段(r-wp)
.data段(r-wp)
.rodata段(r-p)
.text段(r-xp)
没有文件名的内存空间用mmap映射匿名空间
文件名为[stack]
文件名为[heap]

内存分配方式

  1. 从静态存储区分配,在编译时分配好,有全局变量,static变量等。
  2. 在栈上创建,执行函数时,局部变量在栈上创建,执行结束后自动释放。
  3. 从堆上分配,动态内存分配,如用malloc或new申请所需的内存,用free或delete释放内存。

野指针

  1. 指针没有被初始化,就使用。
  2. 指针被free或delete后,没有置位NULL,容易误用。

常见错误

  1. 内存未分配成功,参数指针判断用assert(p!=NULL),用malloc或new申请内存的用if(p!=NULL)
  2. 内存没有初始化
  3. 操作越过内存边界
  4. 忘记释放内存,导致内存泄漏
  5. 释放了内存还继续使用

段错误

访问了错误的内存段

用gdb调试

编译时 加上 -g -rdynamic 参数编译,生成带有调试信息的可执行程序

分析core文件

ulimit -c 1000
gdb ./a.out core

段错误时启动调试
利用backtrace和objdump进行分析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值