例题:

有以下两个文件,输出结果是 ()

文件A:

int a[10] = {100};

文件B:

#include <stdio.h>

extern int *a;

void main()

{

printf("%d", a[0]);

}

A) 100   B) 0   C) 段错误   D) 编译错误

测试结果:

解释:

在extern int *a和printf("%d", a[0])这两条语句中,编译器觉得a是一个指针变量,所以它提取存储在那里的指针值,然后对这个结果运行间接訪问操作。但a实际上是整型数组的起始位置,所以作为"指针"获得的这个值实际上是数组的第一个整形元素。其结果解释为一个地址。然后对它进行间接訪问。作为结果,它或者将提取一些随意内存位置的内容。或者因为某种地址错误而导致程序失败。

段错误的常见原因总结:

一、段错误究根到底就是访问了非法内存

这个内存区要么是不存在的,要么 是受到系统保护的,还有可能是缺少文件或者文件损坏。可能的原因包括:

访问代码段(原因经常是指针未初始化指向了错误的位置或解引用空指针)、访问寄存器

例子1:解引用空指针 int *p=NULL; printf("%d\n",*p); //因为内存低地址为代码段,不可访问

例子2:访问含有非法值得内存 register int p =10; printf("%d\n",*p); //由于register关键字使变量存储到内核寄存器中,因此不能访问

野指针:即定义指针时并未对其初始化,其指向的的位置式未知的。对野指针解引用可能造成段错误或者导致程序崩溃

防止方案:1;定义时初始化为NULL 2;解引用前赋值 3;使用完后指向NULL 每次使用指针之前记得赋值就好了

二、数组越界

如:当使用malloc申请了一页内存,但使用却超出了。 越过数组边界写入数据,在动态分配的内存两端之外写入数据,或改写一些堆管 理数据结构(在动态分配的内存之前的区域写入数据)

堆中:p = malloc(256); p[-1] = 0; p[256] = 0; //访问了未知空间的内存

栈中:int *p=NULL; int a[6]; p=a; for(int i=0;i<10;i++){*p++=i;} //stack smashing detected 访问了未知空间的内存

三、scanf错误使用

int b;

scanf("%d",b);//应为scanf("%d",&b);

四、指针访问只读内存区

如:char *p=“abcddf”; *p=‘A’; //其实本质上错误原因和解引用空指针类似,“abcddf”在被定义时放在了代码段或常量区。

//解决方法是将字符串存到数组中,再将指针指向数组头

这里补充一下程序运行时内存分配:

1 栈区:存放函数运行时产生的临时变量,局部变量、函数的入口参数,返回值和const定义的局部变量,函数结束后由编译器释放。

2 堆区:用于存放程序运行时被动态分配的内存段,一般由程序员手动申请释放malloc申请,free释放。

3 全局区(静态区):全局区用来存储全局变量,主要分为两个段:1. .bss段:该段用于存放未初始化或者初始化为0的全局变量和静态变量(static)

2. .data段:又叫数据段,用于存储初始化不为0的全局变量和静态变量、const定义的全局变量(在.rodata段)

该段在程序结束后由系统释放。

4 常量区:常量字符串就是放在这里的。 程序结束后由系统释放

5 代码区:又叫.text段用于存放函数的代码,部分字符串常量也存在代码段

三个申请内存的函数:

1. void *malloc(unsigned int size); //单位为字节 如要申请200个字节的空间存储int型数据 int *p=(int *)malloc(50 *sizeof(int))

2. void *calloc(unsigned n,unsigned size); //long *buffer; buffer =(long *)calloc(20,sizeof(long)); 获得一块长整型数组空间

3. void *realloc(void *mem_address,unsigned int newsize);//重新分配内存

三种方式,申请成功返回(void *)类型的指针,失败返回NULL;使用完之后切记要free释放

C语言段错误的有用总结相关推荐

  1. [转] Linux C语言 段错误bug的调试

    原来看过一次,后来当自己有段错误的时候,才想起来这个很有用.如果不用他的方法,段错误很恶心的,不好找出来的. 下面就是原文,不过 最初出处不得而知 ======================= 复制 ...

  2. c语言 段错误 指针,求教为什么指针动态申请了空间,scanf的时候还会段错误

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 while(1) { printf("是否要创建新一条学生信息?(y/n)\n"); scanf("%s",ch) ...

  3. pta c语言段错误,PTA常见错误

    1.最常犯的错误:格式错误. 在PTA程序检测中,输入输出要严格按照题目要求.输出的格式要完全按照题目要求来,该空格地方空格,该换行要换行.否则,就算你运行结果是对的,PTA还是提示你格式错误 格式错 ...

  4. c语言 段错误 核心已转移,c语言使用DES_ncbc_encrypt以及段错误 (核心已转储) 解决...

    1.首先安装ssl库文件 sudo apt-get install libssl-dev 引入头文件 #include 2.定义调用方法 void call_cbc(){ DES_cblock key ...

  5. 约瑟夫环c语言出现段错误,算法竞赛入门经典 紫书 第四章

    一点小问题 关于判断素数的几点 //该函数有严重缺点: //不能用于n==1和n较大的情况 //在n接近int的最大值时: //若i=46340时,i*i=2147395600//若i=46341时, ...

  6. C语言再学习 -- 段错误(核心已转储)

    参看:Linux下的段错误产生的原因及调试方法 参看:Linux环境下段错误的产生原因及调试方法小结 参看:维基百科--Segmentation fault 参看:LINUX内核段错误调试详细指南精品 ...

  7. c语言 memset 段错误,段错误之memset对类对象的误用

    1.问题描述 实际项目中,定义一个如下的基类和子类,均包含有虚函数. //基类 class OriginalTask { public: OriginalTask() {}; virtual ~Ori ...

  8. Rust语言——无虚拟机、无垃圾收集器、无运行时、无空指针/野指针/内存越界/缓冲区溢出/段错误、无数据竞争...

    2006年,编程语言工程师Graydon Hoare利用业余时间启动了Rust语言项目.该项目充分借鉴了C/C++/Java/Python等语言的经验,试图在保持良好性能的同时,克服以往编程语言所存在 ...

  9. linux c代码出现段错误,Linux下段错误(C语言)

    问题描述:在Linux下编程有时会出现段错误的提醒,出现这种错误有可能是因为以下几种原因 1.数组越界:如果在初始化或者接收输入时内容超过了定义好的数组元素个数时会出现段错误,Linux的数组越界检查 ...

  10. c是过程化语言吗数据库,关于SQL错误的是()A、所有数据库的公共语言B、非过程化的C、统一的语言D、所有用SQL缩写的程序都...

    关于SQL错误的是()A.所有数据库的公共语言B.非过程化的C.统一的语言D.所有用SQL缩写的程序都 更多相关问题 [多选] 在彩色电视机遥控系统中,属于模拟量控制的有()等几种. [多选] 在色度 ...

最新文章

  1. 每日记载内容总结50
  2. Button的使用(十):ImageButton
  3. html5+CSS3实现的炫酷超链接特效
  4. 开篇语 2008.8.11
  5. 调用非.net系统的Webservice的探索 ( 三 ) -WCF
  6. 遍历DataTable内存数据的三种方法性能对比
  7. 第十节: 利用SQLServer实现Quartz的持久化和双机热备的集群模式
  8. 【CodeForces - 1082B】Vova and Trophies (贪心模拟,暴力)
  9. VMware中让虚拟机支持虚拟化
  10. 处理日期和时间数据--字符串文字
  11. 音视频编码格式和封装格式的关系和区别是什么?
  12. Intellij IDEA 2018 安装和破解
  13. 别墅家庭无线WiFi覆盖解决方案
  14. 【天池竞赛】心跳数据挖掘
  15. 中止执行后超过2年_执行中止。债权人是否两年内都要申请执行一次。如果中止执行两年内不申请执行,是否都再也执行不了...
  16. 用户的基本组与附加组
  17. Linux操作系统相关资料
  18. 【趣谈】| 编程的尽头是玄学?
  19. python大数_使用python的金融大数定律
  20. 因特服务器协议,Internet邮件服务协议

热门文章

  1. 如何下载矢量建筑轮廓
  2. python random设置种子_关于python:如何查询random.random()使用的种子?
  3. 漏洞补丁:漏洞命名(CVE和CNNVD)及补丁查找
  4. 游戏设计的100个原理(1-5)
  5. Mac下Idea快捷键总结(不断更新)
  6. android 1024 github,1024 怎么能少了这款高颜值、敲实用的 GitHub 第三方客户端呢?...
  7. js打开新页面的两种方式
  8. mes服务器连接工业控制系统,智慧工厂实验平台的MES软件系统介绍
  9. JavaScript实现黏贴上传图片功能
  10. 微信人格专业测试软件,如何在微信公众号中关联《九型人格测试专业版》小程序?...