C语言开发过程中段错误处理方法之经典

简介: C语言开发过程中段错误处理方法之经典

目录

第一:访问不存在的内存地址

第二:访问只读的内存地址

第三:代码栈溢出

第四: 内存越界分析

第五:段错误的调试方法


在C语言实际开发过程中,大家可能会遇到段错误,这种错误也是一种常见的错误,那么,段错误是如何产生的?可能的原因有段错误是因为访问不可访问的内存产生的。    

   下面是一些典型的段错误产生的原因:

  • 访问不存在的内存地址
  • 访问只读的内存地址
  • 栈溢出
  • 内存越界

第一:访问不存在的内存地址

#include <stdio.h>
int main(int argc, char **argv)
{
    printf("==================segmentation fault test==================\n");
    int *p = NULL;
    *p = 1234;
    return 0;
}

d9cf1245e91349b6b69488632e9c88d4.png

第二:访问只读的内存地址

#include <stdio.h>
int main(int argc, char **argv)
{
    printf("==================segmentation fault test1==================\n");
    char *str = "hello";
    str[0] = 'H';
    return 0;
}

004100deb2d84b238836893cc145f40a.png

第三:代码栈溢出

#include <stdio.h>
static void test(void)
{
    char buf[1024 * 1024] = {0};
    static int i = 0;
    i++;
    printf("i = %d\n", i);
    test();
}
int main(int argc, char **argv)
{
    printf("==================segmentation fault test2==================\n");
    test();
    return 0;
}

53ddf1c211214f209f108d2b6db6c2c7.png

第四: 内存越界分析

#include <stdio.h>
int main(int argc, char **argv)
{
    printf("==================segmentation fault test3==================\n");
    static char arr[5] = {0, 1, 2, 3, 4};
    printf("arr[10000] = %d\n", arr[10000]);
    return 0;
}

f8225fad2a4a441da2de8613222d87e5.png

第五:段错误的调试方法

     从上面的几个例子中,我们应该对段错误有了一定的认识,但实际项目中,实际中,段错误可能没有上面的例子那么明显看出。如果之前没有这方面的经验,可能一时半会也定位不到问题。

1、使用gdb一步步运行

478b22aef52e4c06b8c9fc987b148d04.png

使用gdb调试,打一些断点、按流程运行下去,运行到段错误的地方会直接提示报错。

或者使用命令行直接gdb调试:

f6b604c607bd4ce08e115f0048be423f.png

总结:不管是在x86上,还是在ARM上都可以使用gdb的调试方法,将对应错误的地方找出来。

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
22天前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
40 6
|
4月前
|
存储 程序员 C语言
C语言的错误处理机制
C语言的错误处理机制
138 0
|
22天前
|
C语言
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性。本文探讨了C语言中的错误类型(如语法错误、运行时错误)、基本处理方法(如返回值、全局变量、自定义异常处理)、常见策略(如检查返回值、设置标志位、记录错误信息)及错误处理函数(如perror、strerror)。强调了不忽略错误、保持处理一致性及避免过度处理的重要性,并通过文件操作和网络编程实例展示了错误处理的应用。
56 4
|
26天前
|
存储 安全 物联网
C语言物联网开发之设备安全与代码可靠性隐患
物联网设备的C语言代码安全与可靠性至关重要。一是防范代码安全漏洞,包括缓冲区溢出和代码注入风险,通过使用安全函数和严格输入验证来预防。二是提高代码跨平台兼容性,利用`stdint.h`定义统一的数据类型,并通过硬件接口抽象与适配减少平台间的差异,确保程序稳定运行。
|
20天前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
39 1
|
20天前
|
NoSQL 编译器 C语言
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。高级技巧包括内存检查、性能分析和符号调试。通过实践案例学习如何有效定位和解决问题,同时注意保持耐心、合理利用工具、记录过程并避免过度调试,以提高编程能力和开发效率。
36 1
|
20天前
|
传感器 存储 物联网
在物联网(IoT)快速发展的今天,C语言作为物联网开发中的关键工具,以其高效、灵活、可移植的特点
在物联网(IoT)快速发展的今天,C语言作为物联网开发中的关键工具,以其高效、灵活、可移植的特点,广泛应用于嵌入式系统开发、通信协议实现及后端服务构建等领域,成为推动物联网技术进步的重要力量。
29 1
|
22天前
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
36 2
|
26天前
|
存储 网络协议 物联网
C 语言物联网开发之网络通信与数据传输难题
本文探讨了C语言在物联网开发中遇到的网络通信与数据传输挑战,分析了常见问题并提出了优化策略,旨在提高数据传输效率和系统稳定性。
|
2月前
|
Java 编译器 C语言
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
30 3
下一篇
DataWorks