记一次Segmentationfault11的愚蠢错误

错误:Segmentation fault: 11

segmentation fault 即段错误,一般都是出现了非法的地址写法操作导致的。

Segmentation fault: 11常见的几种情况:

1、空指针访问。

如果指针为空(NULL), 那么对空指针的读写操作都会导致segmentation fault。

2、指针指向非法区域后的写操作。

C语言的指针指向了非法区域,然后对其写入,会带来不可预知后果,最严重的就是程序崩溃,此时也是segmentation fault。

3、常量空间破坏。

比如常量字符串,如果修改其内容,则会出现segmentation fault。

4、在一些比较老的操作系统上,非对齐访问也可能导致segmentation fault。

在C语言中,任何操作指令都离不开对内存的操作,所以即便编译的时候没有语法操作,但是在实际运行中有可能对内存进行非法操作,这种情况就会产生段错误Segmentation fault (core dumped)!要解决段错误就要先找到段错误的地方。

如何在程序中寻找段错误?

段错误不是语法错误,所以在编译时不会提示出错,只有等到运行时才会提示出现段错误,但是段错误不会提示在哪一行,可以通过printf()函数来寻找段错误位置,只要发生段错误,那么程序就会马上结束。

段错误一般是指针指向有问题,找到段错误的地方最好打印出指针内容看看是不是自己预期的指针内容再进行修改,如果是链表就画图查看自己的链表逻辑有没有出问题

总结解决段错误的步骤:

1.使用printf()函数寻找段错误的地方

2.打印出现段错误的指针,链表或者打开文件目录的返回值看看是不是自己的预期结果

3.根据结果现在修改代码重新编译.


而我最近犯了个愚蠢的错,导致出现段错误,调试了半天。

printf("creating socket ipv4 for listen host %s:%s\n", source_addr, port[0]);

之前我的port是字符串,所以打印时用了%s,port[0]改成uint16_t后忘记改%s,结果报了段错误,还以为是哪个指针出问题了。。。。

改成%hu,就没事了!!!

printf("creating socket ipv4 for listen host %s:%hu\n", source_addr, port[0]);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值