结构体指针之 段错误 具体解释(segmentation fault)
一个网友问了我一个问题。一个C程序执行出现了段错误,这个问题非常好。非常多刚開始学习的人都easy犯这个错误,详细代码例如以下:
这个编译没有问题,可是执行是段错误 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命令来调试
无论是哪一种方法仅仅要可以解决你遇到的额问题,那么就是非常好的。不要怕犯错误。重要的是可以解决错误。
相关文章
- HBase启动RegionServer时报UnknownHostException错误的解决方法
- JavaFx出现错误Caused by: java.lang.NullPointerException: Location is required的解决方法
- 第五十六章 CSP的常见问题 - 我如何修复`Zen`错误
- 解决Redis编译错误zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory
- WinHand.cpp Line 199 错误 WinHand.cpp Line 218 错误
- Spring MVC “404 Not Found”错误的解决
- BCP 运行错误
- (JAVA)错误:Type mismatch: cannot convert from double to float ,这是什么意思?如何解决?
- Cadence错误之 Part xxx is out of date with respect to the design cache.
- 怎么解决Chrome浏览器“Failed to load resource: net::ERR_INSECURE_RESPONSE”错误?
- MySQL 8.x 报错 Public Key Retrieval is not allowed 错误的解决方法
- Winforms Cefsharp应用通过Vs Installer安装,应用崩溃,缺少文件错误
- 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。
- PHP错误捕获处理