结构体指针之 段错误 具体解释(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 ...
随机推荐
- Beego开源项目 收藏
官方收藏的项目 集成开发平台:基于 Golang 的快速开发平台,平台已经集成权限管理,菜单资源管理,域管理,角色管理,用户管理,组织架构管理,操作日志管理等等 OPMS - 是一款项目管理 + OA ...
- Java -verbose[:class|gc|jni] 转 ----JAVA源码分析
http://blog.csdn.net/tenderhearted/article/details/39642275 http://www.cnblogs.com/iceAeterNa/p/4876 ...
- Python 中函数的 收集参数 机制
定义函数的时候,在参数前加了一个 * 号,函数可以接收零个或多个值作为参数.返回结果是一个元组. 传递零个参数时函数并不报错,而是返回一个空元组.但以上这种方法也有局限性,它不能收集关键字参数. 对关 ...
- 教程:如何手动安装Xamarin与Xamarin for VisualStudio
[2016/4/17更新:如果你下载后发现仍然需要付费才能编译Android/iOS APP,请到文章最下面更新Xamarin for VS和Xamarin Studio到最新的版本.Build201 ...
- iOS中使用RegexKitLite来试用正则表达式
转:http://blog.csdn.net/nullcn/article/details/6338592 准备工作,下载RegexKitLite 软件包,解压后有2个文件,需要加载到project中 ...
- C#程序中判断DEBUG和RELEASE状态
编辑 删除 习惯了用老方式(注释的方式)来对程序进行调试,不过昨天才发现这样调试存在很大的隐患:在工程发布的时候如果忘记把该注释的代码注释掉,而让这些调试信息随工程一起发布,如果是可见的调试信息倒好发 ...
- C++点和箭头操作符用
http://www.cnblogs.com/ManMonth/archive/2013/09/05/3302873.html C++点和箭头操作符用法区别 变量是对象的时候用“.”访问 变量是对象指 ...
- 创建、修改、删除ORACLE表空间
//创建表空间 create tablespace MyFirstSpace datafile '/opt/oracle/app/oracle/product/9.2.0/dbs/MyFirstSpa ...
- 安装部署 Kubernetes 集群
安装部署 Kubernetes 集群 阅读目录: 准备工作 部署 Master 管理节点 部署 Minion 工作节点 部署 Hello World 应用 安装 Dashboard 插件 安装 Hea ...
- windows 安装ninja
ninja连接: https://ninja-build.org/ https://github.com/ninja-build/ninja 下载安装包: https://github.com/nin ...