一个网友问了我一个问题。一个C程序执行出现了段错误,这个问题非常好。非常多刚開始学习的人都easy犯这个错误,详细代码例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

这个编译没有问题,可是执行是段错误    Segmentation fault

由于你定义了一个结构体指针p。用来指向此类结构体,可是你却没有给他赋值。此时p的值为NULL。你并没有在内存中为p分配不论什么空间,所以p->a=1这句就会出段错误。

改动方法1:能够给p分配一段内存空间,并使其指向此空间:

p=(struct abc *)malloc(sizeof(struct abc));

p->a = 1;

方法2:能够让p指向一个已存在的内存空间:

struct abc temp;

p=&temp;

p->a = 1;

对付段错误问题利用strace命令能够高速找出现故障的地方!!!!!

为什么会出现端错误呢?我也做了例如以下总结:

出现了Segmentation fault,基本上的原因是,非法的内存訪问。

比如数组的越界,在循环操作时循环变量的控制问题,也有字符串拷贝时长度溢出,指针指向了非法的空间,还有就是申明一个指针,但却没有对其初始化,就直接引用。或者没有开辟内存空间就释放内存,所以要检查申请空间时间偶成功。

还有那个问题在调试时会有这种信息:Program terminated with signal SIGSEGV, Segmentation fault.

对于SIGSEGV这个信号,常常会和SIGBUS信号出如今一块。

SIGBUS与SIGSEGV信号的一般差别例如以下:





1) SIGBUS(Bus error)意味着指针所相应的地址是有效地址。但总线不能正常使用该指针。

   一般是未对齐的数据訪问所致。

2) SIGSEGV(Segment fault)意味着指针所相应的地址是无效地址。没有物理内存相应该地址。

通常导致段错误的几个直接原因:

1、解除引用一个包括非法值的指针。

2、解除引用一个空指针(经常因为从系统程序中返回空指针,并未经检查就使用)。

3、在未得到正确的权限时进行訪问。

4、用完了堆栈或堆空间(虚拟内存尽管巨大,但绝非无限)。

非常多都说犯这样的低级错误一般都是对程序不熟练,我不赞同这样的说话。当我们开发一个大型的项目时候,随时都会出现这个问题,这样的问题非经常见重要的是我们怎么样去调试。解决错误。

这里给大家推荐几个方法:

加入打印语句。二分法打印。

利用starce看系统调用

使用gdb命令来调试

无论是哪一种方法仅仅要可以解决你遇到的额问题,那么就是非常好的。不要怕犯错误。重要的是可以解决错误。

结构体指针之 段错误 具体解释(segmentation fault)的更多相关文章

  1. C语言中全局结构体指针隐含的错误

    前天在嵌入式系统上,调试一个数组的全局变量时,发现该变量一直会动态变化.深入分析, 才发现该全局结构体没有申请内存,而是用了一个指针.这种情况编译器是检查不出来的,在linux 上运行会挂掉,但是在裸 ...

  2. c语言结构体指针初始化

    今天来讨论一下C中的内存管理. 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以前做二叉树算法时,他的左 ...

  3. C语言结构体指针初始化(转)

    reference: https://www.cnblogs.com/losesea/archive/2012/11/15/2772526.html 今天来讨论一下C中的内存管理. 记得上周在饭桌上和 ...

  4. (三)结构体指针、sizeof

    (一)结构体指针定义 今天上班写了一段测试代码,结果在linux下编译出现段错误,刚开始一直找不到原因,后来找了度娘才搞懂了.我先贴出来第一次写的代码以及gcc编译器下报的错误: #include&l ...

  5. RT-Thread定时器以及结构体指针的一些思考

    定时器分为软件定时器和硬件定时器.顾名思义,软件定时器就是有操作系统提供的软件定时器,硬件定时器就是用硬件芯片提供的定时器. 而在RT-Thread操作系统提供的定时器是软件定时器,但是为了便于管理, ...

  6. go语言的结构体指针

    Go 语言结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型.   结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.   结构体表示一项记录,比 ...

  7. c语言结构体以及结构体指针的使用

    结构体: 正常定义一个结构体: typedef struct node{ ]; int len; }Seq,*llink; 定义结构体指针: Seq *s;或者llink t;之后关于s与t的用法,其 ...

  8. Leetcode 2. Add Two Numbers(指针和new的使用)结构体指针

    ---恢复内容开始--- You are given two non-empty linked lists representing two non-negative integers. The di ...

  9. 解惑结构体与结构体指针(struct与typedef struct在数据结构的第一道坎)

    /* 数据结构解惑01  在数据结构中会看到 typedef struct QNode { QElemType data; //数据域 struct QNode *next; //指针域 }QNode ...

随机推荐

  1. TIDB VS COCKROACHEB

    分布式事务 要支持分布式事务,首先要解决的就是分布式系统时间的问题,也就是我们用什么来标识不同事务的顺序.通常有几种做法: TrueTime,TrueTime 是 Google Spanner 使用的 ...

  2. Revit API射线法读取空间中相交的元素

    Revit API提供根据射线来寻找经过的元素.方法是固定模式,没什么好说.关键代码:doc.FindReferencesWithContextByDirection(ptStart, (ptEnd  ...

  3. AngularJS双向绑定,手动实施观察

    实现这样的一个需求:页面中某个地方显示某个文本框的值经过计算得到的结果,而且是文本框值每次变化显示的计算结果也跟着动态变化. 在controller中可以声明一个对象,它的一个字段用来存储初始值: $ ...

  4. 在ASP.NET MVC中使用Knockout实践09,自定义绑定

    Knockout真正强大之处在于绑定机制,通过data-bind属性值体现绑定,不仅可以绑定值,还可以绑定事件,甚至可以自定义绑定. 从一个例子看Knockou的绑定机制 假设想给一个button元素 ...

  5. canvas使用3

    颜色合成 globalCompositeOperation 属性: ? 1 2 3 4 5 6 7 8 9 10 11 //先绘制一个图形. ctx.fillStyle = "#00ff00 ...

  6. Python:日期和时间类型学习

    背景 在非开发环境经常需要做一下日期计算,就准备使用Python,顺便记下来学习的痕迹. 代码 1 # coding = utf-8 2 3 from datetime import * 4 5 ## ...

  7. JAVA 解压压缩包中指定文件或实现压缩文件的预览及下载单个或多个指定的文件

    业务逻辑中还要判读用户是否有此文件的防问权限 2017-04-20 新增文件与文件夹图标显示及过滤高亮显示功能: 2017-05-20 新增搜索向前及向后.及更新下载功能.更新文件路径显示: 测试地址 ...

  8. Work Management Service application in SharePoint 2016

    最近开始弄SharePoint 2016的Workflow,遇到问题发现没有了Work Management Service application,然后用PowerShell命令创建也不行,bing ...

  9. Android之sqlite3命令行简单使用

    首先需要定位到database所在的目录里面,然后使用命令 sqlite3 databasename(数据库的名字)进入 常用命令: 1. .table     列取该数据库下面的数据表名 2. .s ...

  10. 《Linux就是这个范儿》

    <Linux就是这个范儿> 基本信息 作者: 赵鑫磊    (加)Jie Zhang(张洁) 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115359360 上架时间:2 ...