结构体指针之 段错误 具体解释(segmentation fault)
一个网友问了我一个问题。一个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)的更多相关文章
- C语言中全局结构体指针隐含的错误
前天在嵌入式系统上,调试一个数组的全局变量时,发现该变量一直会动态变化.深入分析, 才发现该全局结构体没有申请内存,而是用了一个指针.这种情况编译器是检查不出来的,在linux 上运行会挂掉,但是在裸 ...
- c语言结构体指针初始化
今天来讨论一下C中的内存管理. 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以前做二叉树算法时,他的左 ...
- C语言结构体指针初始化(转)
reference: https://www.cnblogs.com/losesea/archive/2012/11/15/2772526.html 今天来讨论一下C中的内存管理. 记得上周在饭桌上和 ...
- (三)结构体指针、sizeof
(一)结构体指针定义 今天上班写了一段测试代码,结果在linux下编译出现段错误,刚开始一直找不到原因,后来找了度娘才搞懂了.我先贴出来第一次写的代码以及gcc编译器下报的错误: #include&l ...
- RT-Thread定时器以及结构体指针的一些思考
定时器分为软件定时器和硬件定时器.顾名思义,软件定时器就是有操作系统提供的软件定时器,硬件定时器就是用硬件芯片提供的定时器. 而在RT-Thread操作系统提供的定时器是软件定时器,但是为了便于管理, ...
- go语言的结构体指针
Go 语言结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型. 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 结构体表示一项记录,比 ...
- c语言结构体以及结构体指针的使用
结构体: 正常定义一个结构体: typedef struct node{ ]; int len; }Seq,*llink; 定义结构体指针: Seq *s;或者llink t;之后关于s与t的用法,其 ...
- Leetcode 2. Add Two Numbers(指针和new的使用)结构体指针
---恢复内容开始--- You are given two non-empty linked lists representing two non-negative integers. The di ...
- 解惑结构体与结构体指针(struct与typedef struct在数据结构的第一道坎)
/* 数据结构解惑01 在数据结构中会看到 typedef struct QNode { QElemType data; //数据域 struct QNode *next; //指针域 }QNode ...
随机推荐
- 阅读Linux内核源码时建立tags索引
比如在阅读arm架构的Linux内核代码时想建立arm架构相关的索引,可以使用下面的命令: make ARCH=arm tags
- C#复制数组的两种方式,以及效率比较
如何高效地进行数组复制? 如果把一个变量值复制给另外一个数组变量,那么2个变量指向托管堆上同一个引用. 如果想在托管堆上创建另外的一份数组实例,通常使用Array.Copy方法. class Prog ...
- concat函數 函數concat 可以用來合拼兩個或以上的字串。
12. “Mexico 墨西哥”的首都是”Mexico City”. 顯示所有國家名字,其首都是國家名字加上”City”. concat函數 函數concat 可以用來合拼兩個或以上的字串. : SE ...
- 安装oracle 11g环境变量ORACLE_HOME的一个问题 转
http://blog.itpub.net/26129555/viewspace-1243467/报错内容: OUI-10137:An Oracle Home with name ORACLE_HOM ...
- “finally block does not complete normally”的警告解决
但是,java里面不是可以保证finally一定会执行的么,为什么不可以在finally块做return??? 细细看道来: debug一下这个函数,就会惊讶的发现, 里面抛出的异常会被finally ...
- git合并的时候,冲突问题Merging is not possible because you have unmerged files
在做项目工作的时候,同事修改了代码一个cpp代码,我同样也修改了代码,两人代码冲突了,提交之后,他代码git自动合并,并提示: [master| MERGEING]$ git merge my_new ...
- 每天一个linux命令-用户之间切换
怎么从root用户切换到普通用户 su是在用户间切换,可以是从普通用户切换到root用户,也可以是从root用户切换到普通用户.如果当前是root用户,那么切换成普通用户test用以下命令:su - ...
- 实用ExtJS教程100例-007:ExtJS中Window组件最小化
在上一节中我们演示了如何使用ExtJS的Window组件,这篇内容中我们来演示一下如何将窗口最小化. 要让ExtJS标题栏中显示最小化按钮并不麻烦,只需要设置 minimizable: true 即可 ...
- Excel 2016 Power View选项卡不显示的问题
https://zhuanlan.zhihu.com/p/43543442 PowerView是Excel中的Power系列插件之一,可以基于excel制作交互式仪表板. 初学者在使用Power Vi ...
- PHP 5.4.17 发布!
PHP 5.4.17发布.2013-07-04 经过1个RC 上个版本是2013-06-07的5.4.16.修正了大约20个Bug以及几个安全漏洞.尽管5.5.0正式版已经发布.但5.4还未停止更新. ...