在c语言指针的使用过程中,常常会见到段错误的情况,这是由于指针指向的内存空间存在问题引起的。

1.野指针

(指向一块未知区域的指针,被称为野指针,引用野指针,可能会破坏系统的关键数据,导致系统崩溃等严重后果)

#include <stdio.h>int main(int argc, char const *argv[]){int *p;//野指针,没有指向一块明确的地址空间*p = 100;//这里会出现段错误(内存错误)因为p时没有指向地址空间的,系统会随机分配一块//对其赋值操作的话,就属于非法访问printf("%d\n", *p);return 0;}

为了避免这种情况,我们要在定义的时候就要初始化指针变量。或者为其赋值为NULL

2.指针越界

指针越界这种情况,一般在数组中常见,指针指向的地址超出了数组所申请的内存空间,造成指针越界(属于非法访问)

3.指针所指向的内存,被系统回收

这种情况常见于指针函数,返回一个指针变量的时候发生。

解决:尽量不要让返回的指针指向局部变量,局部数组和形式参数。

#include <stdio.h>int * test(int *arr);
int main(int argc, char const *argv[])
{// 段错误演示int arr[10]={0,1,2,3,4,5,6,7,8,9};//调用函数int *p2=test(arr);return 0;
}int * test(int *arr)//一般用int arr[]定义形参
{int arr1[10]={0};//初始化数组//  将数组倒叙输出for (int i = 0; i < 10; ++i){arr1[10-i]=arr[i];}int *p=arr1;return p;
}
/*
1.在上面的代码中,调用了一个返回值为函数的指针变量
2.函数调用后,会立即释放局部变量,所以导致指针p指向的地址无效,导致段错误的发生
*/

注意:上面代码的释放局部变量,不是指的马上销毁这些空间里面的数据,而是指的放弃了对这块空间的使用权限。

比如:

#include <stdio.h>int *func(){int n = 100;return &n;
}int main(){int *p = func(), n;/*1.运行这个代码发现照样可以访问到n的值2.这不和前面说的放弃了对数据的使用权相悖了吗? 答:不是3.这里可以访问到,完全是巧合,因为在后面的代码中,没有其他的再去申请这块地址的使用权4.如果我们在    int *p = func(), n; 的后面加一句printf("cai_grass的博客");就会导致段错误。5.为什么:因为调用了printf()函数过后,会把后面的空间占据,导致p指针指向发生错误
*/n = *p;printf("value = %d\n", n);return 0;
}

4.通过指针去定义数组后更改数据   发生的段错误

#include <stdio.h>int main()
{//定义一个字符数组  修改其中一个位置的值  运行结果正确char name1="caiqiang";name1[1]='M';//通过指针的方式定义然后再去修改 就会报段错误  // char *name="caiqiang";// name[1]='M';// *(name+1)='M';   //这和name[1]='M'都表示一样的操作/*这是为什么呐?1.通过数组的方式,我们先合法的申请了一段地址空间来存储数据 存储的是变量2.指针定义的话  是直接指向了字符串常量 我们知道 常量是不可变的 所以不可更改
*/return 0;
}

5.总结:

  1. 指针定义时,及时初始化
  2. 绝不引用已被系统回收的内存
  3. 确认所申请的内存边界,谨防越界

C语言中报段错误(核心已转储)的常见问题相关推荐

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

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

  2. Ubuntu20.04出现段错误核心已转储问题解决方案

    作为一个半路出家的linuc用户,coredump这个问题太让人抓狂了,网上找了好多都是不全面,不适应或者看不懂:现在终于解决了,记录一下防止以后出现还是无解,同时也分享给大家,希望大家能少踩一些坑. ...

  3. c++如何解决段错误 (核心已转储)

    在后端优化中遇到了段错误 (核心已转储)问题,寻求解决方法. 首先通过不断的注释部分代码,运行,注释,运行,找到一个大概的范围是错在哪一块. 这类问题只能说根本原因是内存的非法操作.建议生成内存段错误 ...

  4. linux下gdb使用core文件调试程序,解决“段错误核心已转储“的问题

    一.core文件介绍以及用途: 1.core文件是什么? core文件包含了程序运行时的内存状态.寄存器状态.堆栈指针.内存管理信息以及各个函数使用堆栈信息等等: 当程序运行过程中出现段错误(Segm ...

  5. 运行orbslam2出现 段错误 (核心已转储)_JDK 14已发布快速预览16个新特性

    JDK 14已经于2020年3月17日如期发布.本文介绍JDK 14特性. JEP 305: instanceof的模式匹配(预览) 通过对instanceof运算符进行模式匹配来增强Java编程语言 ...

  6. 段错误 (核心已转储)_向大厂看齐!为自己的程序增加自动转储的功能!

    如果你还不清楚什么是转储文件,不知道什么时候需要转储文件,请参考转储文件系列文章的第一篇 -- 转储文件知多少. 前言 不知道各位小伙伴有没有遇到过 微信 或者 QQ 崩溃的情况.它们在崩溃的时候都会 ...

  7. mysql出现core dumped_mysql-为什么我遇到分段错误(核心已转储)?

    这是我要运行的代码.它可以编译,并且工作良好,直到昨天. #include #include int main(int argc, char **argv) { MYSQL *conn; MYSQL_ ...

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

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

  9. 段错误(核心已转储)的原因

    一.什么是段错误? 一旦一个程序发生了越界访问,cpu 就会产生相应的保护,于是 segmentation fault 就出现了,通过上面的解释,段错误应该就是访问了不可访问的内存,这个内存区要么是不 ...

  10. Ubuntu 20 core dumped(核心已转储)问题分析

    问题原因: core 指核心(线圈),没有半导体之前,使用线圈内存,指代内存. 可执行文件是分段存储的,加载进内存也是分段的,如代码段.数据段.堆.栈等,段错误的原因往往是碰到了不该碰到的内存位置(如 ...

最新文章

  1. asp.net 网页做一个浮动层_【CSS】7 页面布局:浮动
  2. exec函数组六个函数的用法和区别
  3. window7自带的分区
  4. JS中的HTML片段
  5. servle 3.0 新特性之一 对上传表单的支持
  6. 什么是Mybatis ?
  7. 《大话软件工程—需求分析与软件设计》,给出了分析与设计过程中需要的理论、方法、工具和标准
  8. mysql 增加建表权限,mysql_基本权限模型建表结构
  9. transformer模型_【预训练模型】万字长文梳理NLP预训练模型!从transformer到albert...
  10. 第 5 章 File Share
  11. 网上关于豆瓣的思考搜集
  12. XML注释内容中不能出现“--”
  13. 获取电信光猫天翼网关 3.0超级管理员密码,桥接模式,让网速上一个档次
  14. ppt模板网站哪个好
  15. Java个人职业规划目标改进_java个人职业发展方向规划范文
  16. 轻量级服务器和ECS云服务器有什么区别?
  17. mac u盘linux 双系统安装教程,U盘安装MAC双系统的方法
  18. Matlab 彩色图片直方图均衡化处理 line()函数实现
  19. ubuntu中的内网穿透cpolar下载安装,后台运行及开机自启
  20. 海康摄像头浏览器访问不了

热门文章

  1. 用算法去扫雷(go语言)
  2. Unity编辑器控制粒子系统Playback Time
  3. 谷歌搜索引擎优化(谷歌seo)怎么做?
  4. 三星s9 港版android 9.0,国行三星Galaxy S9/S9+更新One UI正式版,基于安卓9.0
  5. win10商店下载位置_Windows10应用商店程序下载目录在哪 怎样查看win10系统应用商店程序下载目录...
  6. CNVD 与 CNNVD 的区别
  7. Proxmark3的Android客户端,Proxmark3 冰人原版固件及客户端
  8. 使用excel 将度分秒转换为WGS84经纬度
  9. jdk17稳定版来了,jdk8还能香多久?
  10. 阜阳智慧城市建设居全国地市级城市第11位