在学习形参带const限定符时,意外遇到Segmentation fault的bug问题。C程序是在linux环境下运行。

在维基百科上是这样解释Segmentation fault,存储器区段错误(Segmentation fault),又译为存储器段错误,也称访问权限冲是一种程序错误。它会出现在当程序企图访问CPU无法寻址的存储器区段时。当错误发生时,硬件会通知操作系统产生了存储器访问权限冲突的状况。操作系统通常会产生核心转储(core dump)以方便程序员进行调试。通常该错误是由于调用一个地址,而该地址为空(NULL)所造成的,例如链表中调用一个未分配地址的空链表单元的元素。数组访问越界也可能产生这个错误。

在本篇文章里通过几个案例来分析由char * 引起的Segmentation fault。

我们先来看一个关于使用char* 的案例

#include <stdio.h>
void print (char *p1);int main () {print("2020-xx-xx");return 0;
}void print (char *p1) {while ( *p1 != '\0' ){printf("%c",*p1++);}printf("\n");
}

其运行结果为2020-xx-xx,看起来并没有什么问题。但在上面的基础上做一些修改,就会引发Segmentation fault错误,请看下面的案例

#include <stdio.h>
void print (char *p1);int main () {print("2020-xx-xx");return 0;
}void print (char *p1) {char *p =p1;while ( *p1++ != '\0' ){if(*p1== 'x') {*p1 = '1';//这一条语句会引发Segmentation fault错误}}printf("%s\n",p);
}

从上面两个案例来说,实参是字符串常量时,通过形参指针进行访问并不会引发错误,而当你试图想要修改这个指针所指向的值,会引发Segmentation fault错误。

至于为什么会出现Segmentation fault错误,看下面的案例就能清楚了

#include <stdio.h>
int main () {int *p1 =2;int  num=1;int *p2= &num;printf("*p1=%d\n",*p1);printf("*p2=%d\n",*p2);return 0;
}

当你编译这段程序时,会有警告信息:warning: initialization of ‘int *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]

当你运行这段程序时,会有报错信息:Segmentation fault

当你试图向一个未初始化的指针赋值常量时,这往往会引发错误,因为你并不知道指针会指向哪里,这充满了未知!!总之,在使用指针要尽量小心,避免不必要的错误!!!!!

在第一个案例中,可以正常打印字符串,这为什么不会报错,有待进一步研究。下面是strcpy库的正确使用方法.

#include <stdio.h>
#include <string.h>
int main () {char s1[] = "s1";char s2[] = "s2";char *pointer_1 = s1;char *pointer_2 = s2;//正确用法printf("%s\n",strcpy(s1,s2) );printf("%s\n",strcpy(pointer_1,pointer_2) );//这条可以运行,但不推荐使用printf("%s",strcpy(pointer_1,"s2") ); //下面会引发Segmentation fault//printf("%s",strcpy("s1","s2") ); //printf("%s",strcpy("s1",pointer_2) );return 0;
}

文章到此结束,希望能带来一点点收获

由char* 引发的Segmentation fault错误相关推荐

  1. Linux内存显示错误,使用mmap读取内存的内容,出现“Segmentation fault”错误,请

    使用mmap读取内存的内容,出现"Segmentation fault"错误,请帮看看原因. 这个程序的目的是用于功能调试的,正在读取一块网卡使用的dma内存空间,想看看里面的数据 ...

  2. onvif规范的实现:onvif开发常用调试方法 和常见的segmentation fault错误

    在前几篇中,虽然已经实现了rtsp视频流的对接,但是还要做的工作还非常多,onvif本来就是一个覆盖面非常广的一个协议,每一个功能都要填充大量的函数.而且稍不注意就会出现segmentation fa ...

  3. 用GDB调试Segmentation Fault错误

    调试Linux程序的时候,出现Segmentation Fault是最郁闷的事情了,程序代码量很大的时候,可能花很多时间都找不到出错原因.        这里介绍一种对你调试Segmentation ...

  4. ubuntu Segmentation Fault错误原因

    一. 什么是"Segmentation fault in Linux" 所谓的段错误就是指访问的内存超过了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位 ...

  5. centos使用yum时提示Segmentation fault错误的深入研究

    头一次用CentOS,结果就遇到了在用yum时出现了centos使用yum时提示Segmentation fault,这个错误的解决方法网上不少,但是我测试了一下发现不是那么回事,最后几经研究终于搞定 ...

  6. Segmentation Fault 错误原因总结及解决方法

  7. bash 2_quantize.sh遇到错误2_quantize.sh: line 7: 29380 Segmentation fault解决方法

    使用DNNDK-YOLOV3 bash 2_quantize.sh, 出现2_quantize.sh: line 7: 29380 Segmentation fault错误,原因是:检查yolov3- ...

  8. Debug:Program received signal SIGSEGV,Segmentation fault.

    错误描述 最近在用Dev-C++编写程序时,程序能够编译运行,奈何本该接收键盘输入数据的程序,运行之后直接显示"请按任意键继续-"字样结束运行了.调试后发现了报错信息"P ...

  9. 解决sqlplus的segmentation fault或hang问题

    sqlplus应当是DBA 1.0时代使用最为频繁的管理工具,经常有经验丰富的老DBA会提到自己敲过几万次的sqlplus:),但有的时候这个吃饭家伙也会不好用,偶尔还会出现Segmentation ...

最新文章

  1. python中立方_Python编程从入门到实践 第四章练习题
  2. 泰晤士高等教育2020年新兴经济体大学排名出炉,81所中国大陆高校上榜!
  3. 数据库事务的隔离级别 (转)
  4. apache tomcat下32还是64_linux平台下Tomcat的安装与优化
  5. 《ASCE1885的网络编程》---Winsock APIのIP地址转换函数
  6. MySQL数据库端字符集设置
  7. 使用DelayExchange
  8. macos mojave_如何修复macOS Mojave上的模糊字体(使用亚像素抗锯齿)
  9. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 15丨查询活跃业务【难度中等】
  10. SRA 练习:解释 CRUD 矩阵方法,并从上面 “用于化学品跟踪管理系统的 CRUDL 矩阵示例”图中找出被遗漏的需求,并解释是如何找的?
  11. ADO.NET与抽水的故事 系列三——抽水机—Command
  12. servlet 从oracle中结果集,用servlet对oracle进行增删改查
  13. 移动端-项目基础总结------彭记(020)
  14. Kubernetes初识
  15. 【ArcGIS|空间分析|网络分析】8 查找能够为需求点对提供服务的最佳路径
  16. error C2065: ‘_beginthread‘ : undeclared identifier
  17. 详解网站建设方案流程
  18. python123货币转换器_Python之美元大写转换器
  19. Qt 使用WPS或HTML生成word文档
  20. win10由%AppData%、path引申出来对环境变量的探究,与修改注册表的一些血的教训

热门文章

  1. 《Python数据分析》第二版.第二章.[学习笔记][Jupyter notebook]
  2. 【日期类问题】例2.2 Day of week
  3. EMQ MQTT云服务器搭建 - 阿里云轻量应用服务器
  4. CPU中的Little Endian与Big Endian
  5. 《火星人敏捷开发手册》 2011-08-18版本发布
  6. 星尘小组第十一周翻译-设计和优化索引
  7. Nginx + php-fpm + PHP 5.4 + MySQL 5.5 + Zend
  8. 提取字符串中字母数字方法
  9. asp.net identity 学习1
  10. 求职历程之-----我的求职信