C程序 大数组:段错误 (核心已转储)

本文探讨了C/C++编程中常见的“段错误(核心已转储)”问题,并详细解释了如何通过调整栈大小及使用静态变量来避免内存越界导致的错误。文章还介绍了内存空间的基本组成部分。

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

在调试C/C++程序的时候,可能会遇到程序执行错误:段错误 (核心已转储)
当在程序中定义一个大数组或者超大数字的时候,会出现上面的错误;导致这个错误的原因是因为内存越界导致的。

如定义数组:
1:char buf[100000000] = ""; // 错误
2:char buf[8380608] = ""; // 正常 8388608 = 8M ; 8380608 约等于 8M
3:static char buf[100000000] = ""; // 正常

通过上面的测试基本可以分析出来是内存越界的问题;
第一个是错误的,原因是越界了
第二个是因为 linux 系统中对每个线程都有自己的栈,linux系统中默认大小为8M,因为栈中还有其他的,所为会比8M小一点才可以。
这样我们可以修改这个栈的大小就可以解决这个问题,直接用ulimit 命令就可以,ulimit -s 102400; 单位为K,这样就修改为了100MB的大小了;
第三个是因为定义为了静态变量,数据一直是在数据段,定义为 static 也可以的解决这个问题。

内存空间主要由五个部分组成代码段(.text)、数据段(.data)、BSS段(.bss),堆和栈组成,其中代码段,数据段和BSS段是编译的时候由编译器分配的,而堆和栈是程序运行的时候由系统分配的。

获取到目标进程PID: 21585 libil2cpp.so 内存映射段(共53段): 段1: 0x000000735d13d000 - 0x0000007362abd000(长度: 0x0000000005980000) 段2: 0x0000007362abd000 - 0x0000007362abf000(长度: 0x0000000000002000) 段3: 0x0000007362abf000 - 0x0000007362ac7000(长度: 0x0000000000008000) 段4: 0x0000007362ac7000 - 0x0000007362ac8000(长度: 0x0000000000001000) 段5: 0x0000007362ac8000 - 0x0000007362acc000(长度: 0x0000000000004000) 段6: 0x0000007362acc000 - 0x0000007362acf000(长度: 0x0000000000003000) 段7: 0x0000007362acf000 - 0x0000007362b2b000(长度: 0x000000000005c000) 段8: 0x0000007362b2b000 - 0x0000007362b2c000(长度: 0x0000000000001000) 段9: 0x0000007362b2c000 - 0x0000007362b30000(长度: 0x0000000000004000) 段10: 0x0000007362b30000 - 0x0000007362b31000(长度: 0x0000000000001000) 段11: 0x0000007362b31000 - 0x0000007362b32000(长度: 0x0000000000001000) 段12: 0x0000007362b32000 - 0x0000007362b33000(长度: 0x0000000000001000) 段13: 0x0000007362b33000 - 0x0000007362b37000(长度: 0x0000000000004000) 段14: 0x0000007362b37000 - 0x0000007362b38000(长度: 0x0000000000001000) 段15: 0x0000007362b38000 - 0x0000007362b39000(长度: 0x0000000000001000) 段16: 0x0000007362b39000 - 0x0000007362b3a000(长度: 0x0000000000001000) 段17: 0x0000007362b3a000 - 0x0000007362dbf000(长度: 0x0000000000285000) 段18: 0x0000007362dbf000 - 0x0000007362dc0000(长度: 0x0000000000001000) 段19: 0x0000007362dc0000 - 0x0000007363401000(长度: 0x0000000000641000) 段20: 0x0000007363401000 - 0x0000007363402000(长度: 0x0000000000001000) 段21: 0x0000007363402000 - 0x0000007363424000(长度: 0x0000000000022000) 段22: 0x0000007363424000 - 0x0000007363425000(长度: 0x0000000000001000) 段23: 0x0000007363425000 - 0x000000736343a000(长度: 0x0000000000015000) 段24: 0x000000736343a000 - 0x000000736343b000(长度: 0x0000000000001000) 段25: 0x000000736343b000 - 0x0000007363456000(长度: 0x000000000001b000) 段26: 0x0000007363456000 - 0x0000007363457000(长度: 0x0000000000001000) 段27: 0x0000007363457000 - 0x00000073635b5000(长度: 0x000000000015e000) 段28: 0x00000073635b5000 - 0x00000073635b6000(长度: 0x0000000000001000) 段29: 0x00000073635b6000 - 0x0000007364911000(长度: 0x000000000135b000) 段30: 0x0000007364911000 - 0x0000007364912000(长度: 0x0000000000001000) 段31: 0x0000007364912000 - 0x0000007364914000(长度: 0x0000000000002000) 段32: 0x0000007364914000 - 0x0000007364915000(长度: 0x0000000000001000) 段33: 0x0000007364915000 - 0x0000007365035000(长度: 0x0000000000720000) 段34: 0x0000007365035000 - 0x0000007365037000(长度: 0x0000000000002000) 段35: 0x0000007365037000 - 0x0000007365557000(长度: 0x0000000000520000) 段36: 0x0000007365557000 - 0x0000007365558000(长度: 0x0000000000001000) 段37: 0x0000007365558000 - 0x00000073658c4000(长度: 0x000000000036c000) 段38: 0x00000073658c4000 - 0x00000073658c5000(长度: 0x0000000000001000) 段39: 0x00000073658c5000 - 0x00000073658c9000(长度: 0x0000000000004000) 段40: 0x00000073658c9000 - 0x00000073658ca000(长度: 0x0000000000001000) 段41: 0x00000073658ca000 - 0x00000073658e6000(长度: 0x000000000001c000) 段42: 0x00000073658e6000 - 0x00000073658e7000(长度: 0x0000000000001000) 段43: 0x00000073658e7000 - 0x0000007365949000(长度: 0x0000000000062000) 段44: 0x0000007365949000 - 0x000000736594a000(长度: 0x0000000000001000) 段45: 0x000000736594a000 - 0x00000073659f7000(长度: 0x00000000000ad000) 段46: 0x00000073659f7000 - 0x00000073659f8000(长度: 0x0000000000001000) 段47: 0x00000073659f8000 - 0x0000007366400000(长度: 0x0000000000a08000) 段48: 0x0000007366400000 - 0x0000007366401000(长度: 0x0000000000001000) 段49: 0x0000007366401000 - 0x00000073686b7000(长度: 0x00000000022b6000) 段50: 0x00000073686c7000 - 0x00000073695bb000(长度: 0x0000000000ef4000) 段51: 0x000000736979d000 - 0x00000073697a0000(长度: 0x0000000000003000) 段52: 0x00000073697ad000 - 0x00000073697b2000(长度: 0x0000000000005000) 段53: 0x00000073697b5000 - 0x00000073697b7000(长度: 0x0000000000002000) 进程已暂停(PID: 21585) 请输入目标地址(十六进制,例如7B29F2E168): 736503A168 请输入要写入的整数值(十进制,例如123456789): 505416143 页备份成功(页起始地址: 0x000000736503a000) 开始刷新指令缓存... Segmentation fault [进程已结束 - 按回车关闭]
最新发布
07-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值