C语言---形参所导致的段错误

2023-10-27

前言

今天刷B站,无意之间看到一个宣称90%人都会错的嵌入式面试题。感兴趣就看了一下。卡了十多分钟才想明白,只是一个小知识点,但还是分享一下。

题目

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void getmemory(char *p)
{
	p = (char*)malloc(100);
}

void test(void)
{
	char *str = NULL;
	getmemory(str);
	strcpy(str,"hello world");
	printf("%s\n",str);
}

int main()
{
	test();
	return 0;
}

(1)我们看,上面这串代码有什么问题?其实是一个很简单的知识点,但是很容易让人卡住。
(2)如果想不出这串代码的问题,就直接运行试试。
(3)从运行结果上来看,进行的段错误报错。那么我们就需要知道段错误产生的可能原因:
<1>访问未分配的内存:当程序试图访问未经分配的内存区域时,例如使用未初始化的指针或指针越界访问数组,就会导致段错误。
<2>访问空指针:当程序试图访问一个空指针,即指向空地址的指针,而没有进行有效的空指针检查时,会导致段错误。
<3>内存越界访问:当程序试图访问超过数组边界范围的内存位置时,即访问了数组之外的内存,也会导致段错误。
<4>野指针:当程序使用已经释放的内存或已失效的指针时,就会产生野指针,进而导致段错误。
<5>内存对齐错误:某些体系结构要求访问特定数据类型的内存地址必须按照一定的对齐方式进行,如果违反了对齐要求,就会导致段错误。
<6>栈溢出:当程序递归调用层级过深或者使用过多的局部变量导致栈空间耗尽时,也可能引发段错误。
<7>其他异常情况:例如访问只读内存、在信号处理程序中发生错误等也可能导致段错误。

在这里插入图片描述

问题定位

(1)我们知道了段错误产生的可能性之后,开始定位可能的原因。
<1>访问未分配的内存,程序试图访问未经分配的内存区域:这个是存在可能的,因为getmemory()函数中,malloc函数可能没有分配区域。
<2>访问空指针:因为一开始初始化str为空指针,getmemory()函数中malloc函数可能没有返回给str。
<3>内存越界访问:malloc申请的是100个字节数据,而“hello world”一共才12个字节数据(注意,字符串末尾有‘\0’)。所以这个可能性比较小。
<4>野指针:这里虽然申请了内存,但是没有释放,所以可能性也比较小。
<5>内存对齐:这串代码没有内存对齐的内容。所以可能性也很小。
<6>栈溢出:这里才申请100字节的数据,溢出可能性比较小。
<7>访问只读内存什么的,这里也没有出现,所以可能性比较小。
(2)总结来看,有可能是malloc没有分配到内存导致的段错误,也有可能是malloc申请到了内存,但是没有将返回的数据传递给str。

判断malloc是否申请成功内存

(1)我们要判断malloc是否申请成功内存,于是我就打算将strcpy()函数放在getmemory()中即可。
(2)发现可以成功运行,所以malloc内存申请成功了。

在这里插入图片描述

判断是否是访问空指针的问题

(1)如果str为空指针,那么就会出现段错误,所以我就在getmemory()函数后面加上打印str中存放地址的参数。
(2)运行结果来看,发现str果然是空指针。

在这里插入图片描述

问题分析

(1)现在我们知道了,问题出现在str是一个空指针。那么为什么str会是一个空指针呢?
(2)这个就需要涉及到到函数的传参过程了。我们都知道,函数中传入的参数是一个形参。而形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。
(3)那么这就面临一个问题,malloc申请到了一个内存区域,这个区域首地址假设为0x3fff。返回给p之后,因为p是形参,所以函数结束之后,被释放,0x3fff这个值并没有传递到str中。
(4)下面是图解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如何更改

(1)知道形参的工作原理之后,就很好更改了。我们在传参的过程,可以使用二级指针。图解如下

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)改为二级指针之后,我们还需要知道,每一次malloc申请内存,都要记得即使释放内存。所以我还增加了一个freememory()函数。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void getmemory(char **p)
{
	*p = (char*)malloc(100);
}

void freememory(char **p)
{
	free(*p);
	*p = NULL;
}

void test(void)
{
	char *str = NULL;
	getmemory(&str);
	strcpy(str,"hello world");
	printf("%s\n",str);
	freememory(&str);
}

int main()
{
	test();
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言---形参所导致的段错误 的相关文章

  • 让CHAT介绍下V2ray

    CHAT回复 V2Ray是一个网络工具 主要用于科学上网和保护用户的网络安全 它的名字源自Vmess Ray 光线 通过使用新的网络协议 为用户提供稳定且灵活的代理服务 下面是一些V2Ray的主要特性 1 多协议支持 V2Ray 提供了大量
  • 基于java的学生成绩管理系统设计与实现

    基于java的学生成绩管理系统设计与实现 I 引言 A 研究背景和动机 学生成绩管理系统是一个重要的教育工具 能够帮助学校管理学生的成绩和考试结果 以便更好地评估学生的教育水平和发展潜力 Java是一种广泛应用的编程语言 具有跨平台 高效
  • 电商数据api拼多多接口获取商品实时数据价格比价api代码演示案例

    拼多多商品详情接口 接口接入入口 它的主要功能是允许卖家从自己的系统中快速获取商品详细信息 通过这个接口 卖家可以提取到商品的各类数据 包括但不限于商品标题 价格 优惠价 收藏数 下单人数 月销售量等 此外 还可以获取到商品的SKU图 详情
  • 软件测试|使用Python读写yaml文件,你会了吗?

    简介 YAML YAML Ain t Markup Language 是一种可读的数据序列化格式 它常用于配置文件和数据交换 Python 提供了许多库来处理 YAML 文件 在本文中 我们将探讨如何使用 PyYAML 库来读取和写入 YA
  • 电商数据api接口商品评论接口接入代码演示案例

    电商数据API接口商品评论 接口接入入口 提高用户体验 通过获取用户对商品的评论 商家可以了解用户对商品的满意度和需求 从而优化商品和服务 提高用户体验 提升销售业绩 用户在购买商品前通常会查看其他用户的评论 以了解商品的实际效果和质量 商
  • 软件测试|教你如何使用Python绘制出奥运五环旗

    简介 我们之前介绍过使用turtle来绘制正多边形 但是绘制正多边形只是turtle模块最基础的使用 我们可以使用turtle模块绘制出更多不一样的精彩图形 本文就来给大家介绍一个比较简单的turtle绘图实例 绘制奥运五环旗 初始化参数
  • 基于java的物流信息网系统设计与实现

    基于java的物流信息网系统设计与实现 I 引言 A 研究背景和动机 基于Java的物流信息网系统设计与实现的研究背景和动机 随着互联网的普及和电子商务的快速发展 物流信息网系统已成为现代物流管理的重要组成部分 物流信息网系统能够实现物流信
  • 【卡尔曼滤波】具有梯度流的一类系统的扩散映射卡尔曼滤波器研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据 文章
  • 华为OD机试 Java 【计算文件大小】

    题目 一个电脑文件夹系统 每个文件夹里都有一些文件和可能还有其他子文件夹 给定所有文件夹的大小和子文件夹列表 你的任务是找出某一个文件夹及其所有子文件夹里的文件总大小 输入格式 首行有两个数字 文件夹的总数M和你要查询的文件夹ID N 之后
  • 【硕士论文复现】可再生能源发电与电动汽车的协同调度策略研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 1 1 上层问题 1 2 下层问题 2 运行结果
  • 2024诸多大厂春招提前启动!Android的程序员还在等什么

    春招 提前批 已开 xdm别打瞌睡了 格力 顺丰 酷狗 沃尔玛中国 理想 科大讯飞等开启春招 开始收简历了 还有hc的企业提前抢人 春招时间短 节奏快 招满即止 就算挂了也绝不能不投 对企业来说 秋招和春招都是储备人才的黄金时期 春招中 除
  • Android Navigation的四大要点你都知道吗?

    在JetPack中有一个组件是Navigation 顾名思义它是一个页面导航组件 相对于其他的第三方导航 不同的是它是专门为Fragment的页面管理所设计的 它对于单个Activity的App来说非常有用 因为以一个Activity为架构
  • 一台java服务器可以跑多少个线程?

    一台java服务器可以跑多少个线程 一台java服务器能跑多少个线程 这个问题来自一次线上报警如下图 超过了我们的配置阈值 打出jstack文件 通过IBM Thread and Monitor Dump Analyzer for Java
  • Hutool改变我们的coding方式(二)

    Hutool改变我们的coding方式 Hutool 简介 Hutool如何改变我们的coding方式 文档 安装 Maven
  • (2024最新整理)Java最全八股文及答案!

    Java的特点 Java是一门面向对象的编程语言 面向对象和面向过程的区别参考下一个问题 Java具有平台独立性和移植性 Java有一句口号 Write once run anywhere 一次编写 到处运行 这也是Java的魅力所在 而实
  • 最新整理Java面试八股文,大厂必备神器

    在看这篇文章之前 我想我们需要先搞明白八股文是什么 明清科举考试的一种文体 也称制义 制艺 时文 八比文 八股文章就四书五经取题 内容必须用古人的语气 绝对不允许自由发挥 而句子的长短 字的繁简 声调高低等也都要相对成文 字数也有限制 八股
  • 计算机Java项目|电影购票系统

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • 计算机Java项目|基于SSM的篮球系列网上商城设计与实现

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • 【go语言】读取toml文件

    一 简介 TOML 全称为Tom s Obvious Minimal Language 是一种易读的配置文件格式 旨在成为一个极简的数据序列化语言 TOML的设计原则之一是保持简洁性 易读性 同时提供足够的灵活性以满足各种应用场景 TOML
  • 基于节点电价的电网对电动汽车接纳能力评估模型研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据

随机推荐

  • hadoop之MapReduce

    MapReduce的处理过程分为两个步骤 map和reduce 每个阶段的输入输出都是key value的形式 key和value的类型可以自行指定 map阶段对切分好的数据进行并行处理 处理结果传输给reduce 由reduce函数完成最
  • 利用ApiPost实现Mock Server服务

    APIPOST可以让你在没有后端程序的情况下能真实地返回接口数据 你可以用APIPOST实现项目初期纯前端的效果演示 也可以用APIPOST实现开发中的数据模拟从而实现前后端分离 在使用APIPOST之前 你的团队实现数据模拟可能是下面的方
  • gitHub OpenSSL SSL_read: Connection was reset, errno 10054 解决方法

    gitHub OpenSSL SSL read Connection was reset errno 10054 解决方法 将原先使用密码提交的方法 更换为使用基于令牌 token 的身份验证提交 获取方法令牌 token 的步骤如下 在这
  • 最近涉猎的东西总结

    1 Erlang 2 RabbitMQ Java Client 3 Java AES 加密类库 4 Jackson类库 操作Json格式字符串
  • SpringMVC之JSON数据返回与异常处理机制

    目录 一 SpringMVC的JSON数据返回 1 导入Maven依赖 2 配置spring mvc xml 3 ResponseBody注解的使用 3 1案例演示 1 List集合转JSON 2 Map集合转JSON 3 返回指定格式St
  • buck电路上下管_关于Buck变换器上管MOSFET开关速度的优劣势是什么?

    答 Buck变换器上管MOSFET开关速度的分析及提高 目前 Buck变换器在电脑主板 通信电源 手机等电子产品中的应用越来越广泛 随着全世界节能减排的发展 Buck变换器的效率成为评价电源系统性能优劣及可靠性的最重要指标 Buck电路的效
  • string数组转int数组

    string数组类型转换为int数组 方法一 ConvertAll的用法 1 public static int StrToInt string str 2 3 return int Parse str 4 5 6 string arrs
  • 华为CE12808/S9700交换机istack/CSS堆叠主备倒换操作命令步骤

    一 华为CE12808交换机 istack堆叠状态 1 设备型号 交换机一 HUAWEI CE12808 交换机二 HUAWEI CE12808 2 istack堆叠主备倒换操作步骤 2 1 设备当前配置保存并进行备份 2 2 切换所用命令
  • Flink java模拟生成自定义流式数据

    思路如下 定义一个POJO类 注意flink里使用的类必须有一个无参的构造方法 自定义DataSource实现SourceFunction接口 使用ctx collect 传入想要发送的数据就可以了 首先定义一个POJO类 class My
  • 渗透测试工程师的一些面试题3(同样适合刚入门的小白看哦~~~!)

    SQL注入防护 1 使用安全的API 2 对输入的特殊字符进行Escape转义处理 3 使用白名单来规范化输入验证方法 4 对客户端输入进行控制 不允许输入SQL注入相关的特殊字符 5 服务器端在提交数据库进行SQL查询之前 对特殊字符进行
  • TypeError: 'method' object is not subscriptable

    TypeError method object is not subscriptable 此错误一般是函数没加括号导致 下图写错了应该是 case id self sheet cell row 1 value
  • C++ - 重载函数与模板函数(function template)

    参考 CSDN C C 中函数重载的理解 Essential C 一 重载函数 1 1 重载函数的意义 重载函数通常用来在同一个作用域内用同一个函数名命名一组功能相似的函数 这样做减少了函数名的数量 避免了名字空间的污染 对于程序的可读性有
  • 什么是DDoS攻击

    DDoS攻击的定义 DDoS Distributed Denial of Service 分布式拒绝服务 攻击 是指攻击者控制僵尸网络中的大量僵尸主机向攻击目标发送大流量数据 耗尽攻击目标的系统资源 导致其无法正常地响应服务请求 如下图所示
  • 记一次Linux服务器上查杀木马经历

    开篇前言 Linux服务器一直给我们的印象是安全 稳定 可靠 性能卓越 由于一来Linux本身的安全机制 Linux上的病毒 木马较少 二则由于宣称Linux是最安全的操作系统 导致很多人对Linux的安全性有个误解 以为它永远不会感染病毒
  • P1229 遍历问题洛谷

    洛谷P1229 遍历问题 题目描述 我们都很熟悉二叉树的前序 中序 后序遍历 在数据结构中常提出这样的问题 已知一棵二叉树的前序和中序遍历 求它的后序遍历 相应的 已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历 然而给定一棵二
  • 计算机网络总结(2)

    四 分类的IP地址 IPv4的地址长度为32bit 标准分类的IP地址是由网络号和主机号组成 用点分十进制表示 IP地址的指派范围 一般不使用的特殊IP地址 五 数据报封装和分用 1 IP数据报格式 IP数据报的格式能够说明IP协议都具有什
  • 启动终端快捷键

    Ctrl Alt t
  • 【SPDK】六、vhost子系统

    vhost子系统在SPDK中属于应用层或叫协议层 为虚拟机提供vhost blk vhost scsi和vhost nvme三种虚拟设备 这里我们以vhost blk为分析对象 来讨论vhost子系统基本原理 vhost子系统初始化 vho
  • chemdraw怎么连接两个结构_科研小站

    化学结构绘图必备软件 ChemDraw了解一下 软件简介 ChemDraw是由CambridgeSoft公司制作的ChemOffice系列软件 是目前国内外最流行 最有应用价值的化学绘图软件 可以快速 精确地绘制化学结构 是各期刊指定的化学
  • C语言---形参所导致的段错误

    前言 今天刷B站 无意之间看到一个宣称90 人都会错的嵌入式面试题 感兴趣就看了一下 卡了十多分钟才想明白 只是一个小知识点 但还是分享一下 题目 include