【嵌入式C】栈内存与printf,代码正确运行,删掉 printf 代码就崩溃了??

news2024/12/23 22:58:00

目录

  • 1. 删掉 printf 代码就崩溃了
  • 2. 运行代码为什么报错
    • 2.1 为什么程序报错 Segmentation fault ?
    • 2.2 为什么程序每次都稳定的报错?
    • 2.3 研究一下两个局部变量的值和地址?
  • 3. 为什么加一个 “\n”就可以正确执行?疑问??

今天读到一篇有意思的文章【就删了个printf,代码崩了】,是关于栈内存溢出问题的,阅读有感,记录如下。

1. 删掉 printf 代码就崩溃了

就是以下这句代码,删掉就崩溃了 留着代码就正常执行

void fool(){
    int arry[10];
    memset(arry,1,sizeof(arry));
     
    //printf("%s","hello world! \n");   //*****就是这句代码,删掉就崩溃了   留着代码就正常执行
}

void bar(){
    int idx;
    char *buf = (char *)malloc(1);
    buf[idx] = 'A';
}

int main(){
    fool();
    bar();
    return 0;
}

2. 运行代码为什么报错

2.1 为什么程序报错 Segmentation fault ?

2.2 为什么程序每次都稳定的报错?

2.3 研究一下两个局部变量的值和地址?

原因分析:

为什么程序报错 Segmentation fault ?

bar()函数中,局部变量 idx 未初始化,未初始化的变量是一个随机值,所以 当*buf只分配了1字节空间时,buf[idx] 赋值,明显是内存访问异常了

为什么程序每次都稳定的报错?

按照问题1 的解答,idx 若果是个随机数,那么就有概率随机数是一个比较小的数,比如0和1,就会有小概率的时候不报错,但是事实上是运行 1000次也会报错1000次,这是为什么?

通过设置断点调试发现,idx 可不是个随机数,而是每次都有一个固定的值,如下图所示

固定值 16843009 可不是一个随机数,它的16进制为 0x01010101,这下明白了吧?idx的值和 fool() 函数中的 arry[0] 的值一致,恰巧这两个都是 局部变量,我们进一步研究

image-20231117182823272

研究一下两个局部变量的值和地址

通过打印信息看出,这两个局部变量的地址竟然一样,因此 idx这个局部变量刚好是申请在了上次刚刚用完的栈空间

image-20231117183620813

解释如下:

  • 执行 fool() 函数时,在栈上申请了 40 字节空间,并给每个地址赋值 0x01010101 ,执行完 fool() 函数,栈空间释放
  • 执行 bar() 函数时,栈指针在上次的位置,继续申请空间,还是在 地址20的位置,由于 idx 变量未初始化,因此还是上次残留的值,也就是 0x01010101

image-20231117184211518

3. 为什么加一个 “\n”就可以正确执行?疑问??

这个问题我还没搞明白,有了解的大神欢迎留言。

image-20231117184959469

image-20231117185123553

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1220428.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑五来袭,如何利用海外代理进行助力

黑五作为下半年年度尤为重要的一个节日,是各大商家的必争之地,那么海外代理是如何帮助跨境商家做好店铺管理和营销呢? 为什么跨境人都关注海外代理,下面我们来进行介绍。 一、什么是海外代理 海外代理就是我们所说的&#xff1…

Snipaste 截图悬浮工具【实用教程】

下载安装 Snipaste windows64位版本下载链接:https://pan.baidu.com/s/1i2L3JHxOGqkmX3lj2fUVHA?pwdeut6 无需安装,解压后即可使用 其他版本见官网 https://zh.snipaste.com/download.html 启动 Snipaste 双击解压后文件夹 Snipaste-2.8.8-Beta-x64 中…

零基础安装分布式数据服务注册系统

一、先安装VM虚拟机,安装最新的ubuntu22系统, 先安装mysql, sudo apt install mysql-server sudo mysql_secure_installation 根据自己需求选择 密码安全级别时,选择n 删除匿名用户?(按y|Y表示是&…

【字符编码系列一】ASCII编码是什么?

介绍 ASCII 编码于 1967 年第一次发布,最后一次更新是在 1986 年,迄今为止共收录了 128 个字符,包含了基本的拉丁字母(英文字母)、阿拉伯数字(也就是 1234567890)、标点符号(,.!等&…

duplicate复制数据库单个数据文件复制失败报错rman-03009 ora-03113

duplicate复制数据库单个数据文件复制失败报错rman-03009 ora-03113 搭建dg过程中,发现有一个数据文件在复制过程中没有复制过来,在备库数据文件目录找不到这个数据文件 处理方法: 第一步:主库备份86#数据文件 C:\Users\Admi…

信息安全相关标准

GB/T 25070-2019 信息安全技术 网络安全等级保护安全设计技术要求 在线预览|GB/T 25070-2019 (gb688.cn) 每一级安全保护环境分为安全计算环境,安全区域边界,安全通信网络。 一级通用安全计算环境 二级通用安全 计算环境 三级 通用安全计算环境 第四级…

漏电继电器 JELR-(120)FG AC220V 零序电流互感器 孔径φ45 上海约瑟

JELR-FG系列漏电继电器 JELR-15FG漏电继电器; JELR-25FG漏电继电器; JELR-32FG漏电继电器; JELR-63FG漏电继电器; JELR-100FG漏电继电器; JELR-120FG漏电继电器; JELR-160FG漏电继电器; JELR-200FG…

调用本地大模型实现聊天机器人ChatBot

AWS Instance本地部署大模型 AWS上申请带GPU的instance,例如g4dn系列,申请instance后安装CUDA的driver,driver安装完成后,就可以在带gpu的instance上部署开源的大模型了。如果想了解在aws上部署本地模型细节,可以阅读…

【网络奇遇记】那年我与计算机网络的初相识 —— 网络的体系结构

🌈个人主页:聆风吟 🔥系列专栏:网络奇遇记、数据结构 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 一. 常见的三种计算机网络体系结构1.1 开放系统互连参考模型1.2 TCP/IP参考模型1.3 原理参考模型 二…

Axure基础详解二十:中继器随机抽奖效果

效果演示 组件 一、中继器 建立一个“中继器”内部插入一个“正方形”,给“正方形”添加一个【样式效果】>>【选中状态】填充背景为红色,字体白色。在中继器表格中插入两列数据函数:【xuhao】(序号列,按12345……填写&…

系列八、JVM的内存结构【方法区】

一、概述 方法区是一个供各线程共享的运行时内存区域。它存储了每一个类的结构信息,例如运行时常量池(Runtime Constant Pool)、字段和方法数据、构造函数和普通方法的字节码内容。上面讲的是规范,在不同的虚拟机里面实现是不一样…

【论文阅读】基于隐蔽带宽的汽车控制网络鲁棒认证(一)

文章目录 Abstract第一章 引言1.1 问题陈述1.2 研究假设1.3 贡献1.4 大纲 第二章 背景和相关工作2.1 CAN安全威胁2.1.1 CAN协议设计2.1.2 CAN网络攻击2.1.3 CAN应用攻击 2.2 可信执行2.2.1 软件认证2.2.2 消息身份认证2.2.3 可信执行环境2.2.4 Sancus2.2.5 VulCAN 2.3 侧信道攻…

Linux---(七)Makefile写进度条(三个版本)

文章目录 一、前提引入🎗️下面的代码什么现象?🎗️下面的代码什么现象? 二、缓冲区三、回车换行🎗️注意🎗️图解🎗️老式回车键造型(意思是充当两个动作)🎗…

一张图厘清各大操作系统的发展脉络

Unix:Unix是一种多用户、多任务、支持多种处理器架构的操作系统。它最初由贝尔实验室的Ken Thompson和Dennis Ritchie在20世纪70年代初开发,是第一个广泛使用的通用操作系统。Unix具有可移植性和可扩展性,因此被广泛应用于服务器、工作站和超…

轻松搭建短域名短链接服务系统,可选权限认证,并自动生成证书认证把nginx的http访问转换为https加密访问,完整步骤和代码

轻松搭建短域名短链接服务系统,可选权限认证,并自动生成证书认证把nginx的http访问转换为https加密访问,完整步骤和代码。 在互联网信息爆炸的时代,网址复杂而冗长,很难在口头告知他人,也难以分享到社交媒体…

学人工智能等于失业?

随着科技的快速发展,人工智能已经渗透到我们生活的方方面面,从手机、智能家居到自动驾驶汽车,都离不开人工智能技术的支持。 因此,学习人工智能已经成为越来越多人追求高薪职业的选择。在这篇文章中,我们将探讨学习人…

树状图怎么画?推荐这个好用的在线树状图软件!

在日常工作和学习中,我们需要用到各种各样的图表,树状图是其中之一。 树状图是什么? 树状图是一种层次式的图形结构,可以用来展示数据之间的关系,并且可以在一定程度上提高工作和学习的效率。 树状图通常用来表示…

第七部分:Maven(项目管理工具)

目录 Maven简介 7.1:为什么学习Maven? 7.1.1、Maven是一个依赖管理工具 7.1.2:Maven是一个构建工具 7.1.3:结论 7.2:Maven介绍 7.3:Maven的优点 Maven安装和配置 7.4:安装教程及环境配置 …

echarts双轴刻度线y轴刻度线对齐

splitNumber属性主要用于设置坐标轴分割的段数。例如,在类目轴(category)中,可以通过设置splitNumber属性来控制坐标轴被分割成的段数。需要注意的是,这个分割段数只是一个预估值,最终实际显示的段数会在这…

采访仁川市政府:探索《仁川登陆行动》体验及其 NFT 作品集背后的故事!

请简单介绍一下自己 大家好,我是仁川市政府品牌经理崔俊浩,负责《仁川登陆行动》的元宇宙活动。很高兴见到您。 是什么启发了你创作《仁川登陆行动》体验? 《仁川登陆行动》并未得到广泛认可,并且被认为是一项几乎不可能完成的任务…