c语言 free函数报段错误,linux下C编程free()时出现飘忽诡异的段错误(核心已转储)问题...

先说一下问题现场。

代码如下

free(volthisframe->Tops);

free(volthisframe->Bots);

printf("what\n");

free(volthisframe->SCTops);

free(volthisframe->SCBots);

运行时出现段错误,“what”随机出现,也就是说可能是打印前出现段错误,也可能是打印后出现段错误。但最终定位就在这几行free里面。

人格保证,各个指针都有初始化,都有检查,代码这里没有列出来而已。

困扰了我2,3天时间,因为完全无法解释free出现段错误这个问题背后的原因,指针是绝对正常的。后来查阅了大量资料,终于理了个脉络出来,大概知道怎么回事了。进一步的debug还在进行中。。。

提醒:这只是泛泛而谈,因为内存管理的问题跟语言、编译器、操作系统都有关系,windows下和linux就大不相同,本文也没有想精确定位,只是给个思路而已。

下面是具体分析,首先是参考资料

参考资料

这个问题跟C语言和编译器的内存分配,linux的内存管理都有关系,一个一个来。

出现段错误的情况,基本还是栈溢出(使用的内存空间大于系统默认分配的栈空间)[2][5]

数组越界[3]

访问不存在的地址(指针NULL)[5]

访问系统保护的内存地址[5]

访问只读的内存地址[5]

关于入栈、出栈[1]讲了一点,在子函数调用的时候的情况,注意这只是多数情况,具体的系统很可

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误是指在Linux系统中出现段错误,也称为“核心已转储”。这通常是由于程序访问了无效的内存地址或者试图访问未分配的内存空间所导致的。这种错误通常会导致程序崩溃或者异常退出。要解决这个问题,需要检查程序代码中是否存在内存访问错误,并进行修复。 ### 回答2: 出现linux段错误 (核心已转储)表示程序在运行过程中访问了一个非法的内存区域,或者使用了未初始化的指针,导致程序崩溃。这种错误通常是由于代码缺陷、数量转换错误或非法指针引用等引起,需要仔细检查程序代码和运行环境。 通常情况下,段错误 (核心已转储) 是可以通过下列方式来解决的: 1. 了解错误原因:查看 core dump 文件,利用 gdb 调试程序,并通过 backtrace 命令查看函数调用栈,确定错误原因。确定错误原因之后,修复代码中的缺陷。 2. 检查代码缺陷:代码缺陷是导致段错误的主要原因之一,常见的错误包括空指针、越界访问数组、基于未初始化变量使用结构体、虚函数,以及多线程锁同步等问题。开发人员需要加强代码安全性、可移植性等方面的检查。 3. 修复数量转换错误:在程序中,有候需要进行数据的类型转换,如果转换不恰当,就会引发段错误。要避免出现这种错误,需要在进行数据类型转换更加小心,了解数据类型的范围和取值范围,避免出现数量转换错误。 4. 检查运行环境:有些候,程序崩溃的根本原因是出现了运行环境问题,例如内存泄漏、资源被耗尽等问题。检查运行环境可以通过一系列指标、日志等来判,例如 CPU、内存等利用率情况。 总之,linux段错误 (核心已转储)是一个比较棘手的问题,需要开发人员善于分析、识别、解决,通过上述措施,可以有效避免程序崩溃,提高程序的整体稳定性和运行效率,减少开发人员的调试和测试成本。 ### 回答3: Linux段错误核心已转储)是指在Linux操作系统中出现了一个严重的程序错误,并导致程序崩溃。当操作系统检测到这种情况,它会将程序在崩溃正在执行的内存中的数据转储到硬盘中存储。这个存储区域通常称为core dump或核心转储。 Segmentation fault的意思是进程试图访问一个不存在的内存地址或无法访问的内存地址,因此操作系统会终止该进程并将内存转储到core文件中。 通常,引起段错误的原因有三种:指针使用不当、内存泄漏和内存损坏。 指针使用不当:当程序运行,必须确保指针指向一个已分配的内存区域,并且该内存区域已经初始化。否则,当程序尝试引用该内存区域,将导致段错误。 内存泄漏:内存泄漏发生在程序运行,当没有释放已分配的内存,它将增加操作系统内存的需求。因此,内存使用量超过了系统可使用的内存,导致了段错误。 内存损坏:如果程序在运行过程中写入一个已经释放的内存地址或未分配的地址,则会对内存造成损坏。当程序尝试移动或读取已经损坏的内存,会出现段错误。 要解决段错误,可以使用一些调试工具来找出程序中的问题。可以使用GDB来检查程序中出现错误的代码行。通过使用valgrind命令,可以在运行中随检查内存泄漏的情况。如果确定是代码问题,则需要仔细检查代码并纠正错误。最后,可以使用 -g 选项编译程序代码,以便在出现段错误更方便地进行调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值