某厂校招一道关于C的笔试题

news2024/9/21 12:23:58

一、笔试原题

题目:在Linux  x86 _ 54   gcc环境下,下面的程序会出现什么问题?运行结果是什么?为什么?

程序如下图:

通过在gcc的环境下编译运行,发现运行结果为不断死循环打印0-17的数字

我们可以看到这段代码很明显有数组访问越界的问题,但理论上说当 i==18后,进入循环的条件不满足,理应会停止循环,为何会产生死循环的结果那?


 二、探讨原因

我们先看一段在VS2019编译环境下的代码的运行结果:

代码如下:

int main() {
	int i;
	int arr[10];
	
	for (i = 0; i <= 12; i++)
	{
		arr[i] = 0;
		printf("%d",i);

	}
	return 0;
}

运行结果为:

可以看到,结果也是同样的死循环,两段代码虽然不同但有共同之处,我们对这段代码进行调试寻找答案:(关于调试技巧,可以查看博主这篇文章实用编程调试技巧)


调试步骤

这是数组临界 i==15 时的变量信息:

 此时一切正常,arr[16]与[17]因为越界被赋予随机值


当数组越界 i==16、i==17时的变量信息:

 我们发现虽然越界了,但是arr[16]、arr[17]的值竟然也被赋值为0,因为我们大胆推测arr[18],应该也是初值为随机值,执行一次循环体后被赋值为18


在调试监视窗口加入arr[18]的信息:

但是事情并不像我们所想的那样,arr[18]的初值并不是随机值,而是等于17,与i相等,为了验证不是巧合,我们修改值再做比较(同样是循环体条件的数值和数组大小值差2)


修改相关值验证上方arr[18]=i不是巧合:

发现这段代码arr[12]也=i,所以这不是巧合


找到代码中死循环的触发原因:

当给arr[18]赋值为0时,i的值也相应改为0,因为可以再次满足循环条件,重复执行循环语句


三、解释原因

 arr[18]和i的值共同改变,可以推测出二者应该是在内存中占用了同一个地址

通过查阅相关资料后我们明白:

1、i和arr是局部变量,局部变量是放在栈区上的,而栈区内存的使用习惯是先使用高地址空间,再使用低地址空间

2、数组随着下标的增长地址由低到高变化

如下图所示:

如果i存放的地址每次都与数组最后一个元素的地址差2个空间,那么就会造成VS2019编译环境下的那段代码造成死循环。

而每次都差2个空间并不是巧合,是因为不同编译环境下i存放的地址与arr相差多少空间是固定的(由编译器自己设定):

VC6.0中,会空0个整型

gcc中,会空1个整型

VS2013/VS2019,会空2个整型

而原题是在gcc的环境中编译运行代码,i的地址与a的地址间会空一个长整型,造成死循环(原因与上方VS2019中的代码完全类似):

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

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

相关文章

TCP之三次握手四次挥手与UDP区别

文章目录 1 TCP三次握手四次挥手1.1 数据包说明1.1.1 TCP数据包1.1.2 UDP数据包1.1.3 TCP和UDP差异1.1.4 TCP可靠性传输机制 1.2 三次握手1.2.1 三次握手定义1.2.2 三次握手问题1.2.2.1 问题引入分析1.2.2.2 历史连接1.2.2.3 同步双方初始序列号1.2.2.4 避免资源浪费 1.3 四次挥…

Github Copilot AI保密级教程

Copilot 是一款由 OpenAI 推出的人工智能代码自动补全AI工具&#xff0c;它可以帮助程序员更快、更准确地编写代码。Copilot 的核心技术基于 GPT-3 模型&#xff0c;但是在编码方面是优于GPT-3的&#xff0c;它可以根据程序员输入的上下文和代码提示&#xff0c;自动生成符合语…

微信小程序如何自定义导航栏,怎么确定导航栏及状态栏的高度?导航栏被刘海、信号图标给覆盖了怎么办?

声明&#xff1a;本文为了演示效果&#xff0c;颜色采用的比较显眼&#xff0c;可根据实际情况修改颜色 问题描述 当我们在JSON中将navigationStyle设置成custom后&#xff0c;当前页面的顶部导航栏就需要我们制作了&#xff0c;但出现了一下几个问题&#xff1a; 导航栏的高…

51-12 多模态论文串讲—BLIP 论文精读

视觉语言预训练VLP模型最近在各种多模态下游任务上获得了巨大的成功&#xff0c;目前还有两个主要局限性: (1) 模型角度: 大多数方法要么采用encoder模型&#xff0c;要么采用encoder-decoder模型。然而&#xff0c;基于编码器的模型不太容易直接转换到文本生成任务&#xff0…

高德打车引入“红绿灯倒计时”能力,算力技术升级打车体验

打到的车还有多久能到&#xff1f;接驾车辆原地不动是什么原因&#xff1f;乘客在打车时&#xff0c;常常因为无法了解实时接驾路况&#xff0c;容易出现“等车焦虑”。 如今&#xff0c;高德打车已全面应用“红绿灯倒计时”能力&#xff0c;让乘客在等车时就能掌握接驾路况&am…

在线ai扩图是什么?有什么工具?分享3个好用的工具。

在线ai扩图是什么&#xff1f;有什么工具&#xff1f;分享3个好用的工具。 在当今数字化的时代&#xff0c;图像处理成为了我们日常生活和工作中不可或缺的一部分。有时候&#xff0c;我们需要将图像放大以获取更多的细节&#xff0c;但传统的方法往往会导致图像质量的损失。幸…

阿里云服务器ECS介绍_高性能云服务器_为了无法计算的价值

阿里云高性能云服务器60%单实例最大性能提升&#xff0c;35Gbps内网带宽&#xff0c;网络增强&通用型云服务器、本地SSD型云服务器、大数据型云服务器、GPU异构型云服务器&#xff0c;阿里云百科aliyunbaike.com分享阿里云高性能云服务器&#xff1a; 阿里云高性能云服务器…

云原生分布式多模架构:华为云多模数据库 GeminiDB 架构与应用实践

文章目录 前言一、GeminiDB 总体介绍1.1、华为云数据库全景图1.2、GeminiDB 发展历程1.3、GeminiDB 全球分布情况 二、GeminiDB 云原生架构2.1、核心设计&#xff1a;存算分离&多模扩展2.2、存算分离&多模扩展核心优势2.3、高可用&#xff1a;秒级故障接管2.4、弹性扩展…

java基于SSM框架的宿舍管理系统的设计与实现论文

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对宿舍信息管理的提升&#xff0c…

高精度恒流/恒压(CC/CV)原边反馈功率转换器

一、产品概述 PR6214是一款应用于小功率AC/DC充电器和电源适配器的高性能离线式功率开关转换器。PR6214采用PFM工作模式&#xff0c;使用原边反馈架构&#xff0c;无需次级反馈电路&#xff0c;因此省去了光耦和431&#xff0c;应用电路简单&#xff0c;降低了系统的成本和体积…

macbook安装配置maven3.6.1(包含将jdk更新至11版本)

参考博客&#xff1a; https://blog.csdn.net/qq2019010390/article/details/125472286 下载和安装 首先&#xff0c;在maven官网下载macOS系统所需的压缩包 官网的地址&#xff1a;https://maven.apache.org/download.cgi 因为要下载的版本是3.6.1&#xff0c;所以要在历史…

K8S后渗透横向节点与持久化隐蔽方式探索

前言 通常在红蓝对抗中&#xff0c;我们可能会通过各种方法如弱口令、sql注入、web应用漏洞导致的RCE等方法获得服务器的权限&#xff1b;在当前云原生迅猛发展的时代&#xff0c;这台服务器很可能是一个容器&#xff0c;在后续的后渗透由传统的提权变为容器逃逸&#xff0c;内…

山海鲸:开创城市发展管理可视化新篇章

随着城市化进程的加速&#xff0c;城市管理面临着前所未有的挑战。如何实现高效、精准的城市管理&#xff0c;提升城市居民的生活质量&#xff0c;成为城市发展亟待解决的问题。山海鲸城市发展管理可视化解决方案应运而生&#xff0c;它利用先进的技术和创新的理念&#xff0c;…

使用ffmpeg对视频进行静音检测

1 原始视频信息 通过ffmpeg -i命令查看视频基本信息 ffmpeg version 6.1-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 project)configuration: --enable-gpl --enable-version3 --enable-sta…

第11章 2 文件和io操作 +

本章总结和章节选择题 p160 很奇怪&#xff0c;只有先写了列表&#xff0c;在遍历file 才有打印 若文件原来就有内容&#xff0c;w open 完之后&#xff0c;文件内容就被清空了 open操作若不指定打开模式&#xff0c;默认打开模式是r 文本打开时&#xff0c;是按照字符串 实…

苍穹外卖学习----出错记录

1.微信开发者工具遇到的问题&#xff1a; 1.1appid消失报错&#xff1a; {errMsg: login:fail 系统错误,错误码:41002,appid missing [20240112 16:44:02][undefined]} 1.2解决方式&#xff1a; appid可在微信开发者官网 登录账号后在开发栏 找到 复制后按以下步骤粘贴即…

android自定义来电秀UI

简单来电秀功能&#xff0c;效果如图&#xff1a; 底部附上demo 一、新建一个PhoneCallService服务&#xff0c;在服务中监听来电等状态&#xff0c;且控制UI显示 public class PhoneCallService extends InCallService {private final Call.Callback callback new Call.Ca…

调试(c语言)

前言&#xff1a; 我们在写程序的时候可能多多少少都会出现一些bug&#xff0c;使我们的程序不能正常运行&#xff0c;所以为了更快更好的找到并修复bug&#xff0c;使这些问题迎刃而解&#xff0c;学习好如何调试代码是每个学习编程的人所必备的技能。 1. 什么是bug&#xf…

vue3hooks的使用

在 Vue 3 中&#xff0c;hooks 是用于封装组件逻辑的方法&#xff0c;类似于 Vue 2 中的 mixins。 使用 Hooks 可以提高代码的可维护性、可读性、可复用性和可测试性&#xff0c;降低代码之间的耦合度&#xff0c;使得组件的状态更加可控和可预测。 要使用 hooks&#xff0c;…

数据安全保障的具体措施有哪些

随着信息化时代的到来&#xff0c;数据已经成为企业和社会发展的重要资产。然而&#xff0c;数据安全问题也日益突出&#xff0c;如何保障数据的安全性、完整性和可用性成为了亟待解决的问题。以下将详细探讨数据安全保障的各个方面&#xff0c;以期为企业和社会提供更好的数据…