记今天在运行程序时出现的segmentation fault(core dumped)

刚刚在复习数据结构的时候写了一些单链表的操作,运行的时候出现segmentation fault(core dumped) 一番查错后发现原来在写初始化链表的时候形参少加了一级指针,修改完后可以正常运行,以为这就是造成segmentation fault 的原因。
过了一会想到我之前也有犯过少加一级指针这种错误,但是怎么没遇到过segmentation fault?
经过一番搜索和测试,最终发现这次segmentation fault的真正原因,那就是我使用了空指针
小测试程序如下:

	#include<stdio.h>
	int main()
	{
	    int *m;     //默认初始化为NULL
	    printf("It' OK here.\n");
	    printf("*m = %d\n",*m);   //使用NULL指针导致segmentation fault.
	    printf("Is here OK?\n");
	    return 0;
	}

运行结果如下图:

在这里插入图片描述

另外附上一篇关于segmentation fault(cord dumped)原因的文章

原地址:https://www.cnblogs.com/foreverW/p/7295201.html

Segmentation fault 这个提示还是比较常见的,这个提示就是段错误,这是翻译还是十分恰当的。

Core Dump 有的时候给我们呈现的翻译很有趣是”吐核“,但是实际上比较贴切的翻译是核心转储(是操作系统在进程收到某些信号而终止运行时,将此时进程地址空间的内容以及有关进程状态的其他信息写出的一个磁盘文件。这种信息往往用于调试),这个“吐核”的产生和王安博士有着一些关联,其实“吐核”这个词形容的很恰当,就是核心内存吐出来。

出现这种错误可能的原因(其实就是访问了内存中不应该访问的东西):

1,内存访问越界:

(1) 数组访问越界,因为下标出超出了范围。

(2) 搜索字符串的时候,通过字符串的结尾符号来判断结束,但是实际上没有这个结束符。

(3)使用strcpy, strcat, sprintf, strcmp,strcasecmp等字符串操作函数,超出了字符中定义的可以存储的最大范围。使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。

2,多线程程序使用了线程不安全的函数。

3,多线程读写的数据未加锁保护。

对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成核心转储

4,非法指针

(1)使用NULL指针

(2)随意使用指针类型强制转换,因为在这种强制转换其实是很不安全的,因为在你不确认这个类型就应该是你转化的类型的时候,这样很容易出错,因为就会按照你强制转换的类型进行访问,这样就有可能访问到不应该访问的内存。

5,堆栈溢出

不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值