18. 《C语言》——【Nice2016年校招笔试题引发的思考】


在这里插入图片描述


亲爱的读者,大家好!我是一名正在学习编程的高校生。在这个博客里,我将和大家一起探讨编程技巧、分享实用工具,并交流学习心得。希望通过我的博客,你能学到有用的知识,提高自己的技能,成为一名优秀的程序员。如果你有任何疑问或建议,请随时在评论区留言,让我们一起成长进步!现在,让我们开始这场知识之旅吧!


在这里插入图片描述

🏞️个人主页: FEN03
📊收入专栏: C语言

🌻🌼🌷🪻🌹🌷🌼🌻🌺🌹🪻🌼🌻🌺🌷🪻🌹🌷🌼🌻🌺🌻🌷🪻🌹🪻🌷🌼🌻🌻🌺🌼🌷🪻🌹🪻🌷


🎄文章目录

  • 🦊 前言 🍖
  • 🫎 Nice2016年校招笔试题 🥩
  • 🦦相同类型题目🥓
  • 👋🏻结束语🌹


🦊 前言 🍖

今天,有位朋友给我看了这道题,发现与Nice在2016年校招笔试题中的一道题是类似的,那么就让我们一起来探讨吧~ ⬇️⬇️⬇️


🫎 Nice2016年校招笔试题 🥩


下边代码为Nice在2016年校招笔试题中的其中一道,让我们来一起看看吧😃😃

要求是在LInux X86_64 gcc环境下,下面的程序会出现什么问题?运行结果是什么?为什么?

#include<stdio.h>
int main(int argc, char* argv[])
{
	long i;
	long a[16];
	for (i = 0; i <= 17; i++)
	{
		a[i] = 0;
		printf("%d ", i);   
	}
	return 0;
}

当我看到这一道题目时,我就想起来有一道与它相似的,这道题目最早是出自于《C语言陷阱与缺陷》,那么接下来就让我们一起看看吧~ 🌹


🦦相同类型题目🥓


那么我在VS2022中,X86,Debug的环境下,并且编译器不做任何的优化,下面的代码会执行什么样的结果呢❓❓❓

#include <stdio.h>
int main()
{
	int i = 0;
	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
	for (i = 0; i <= 12; i++)
	{
		arr[i] = 0;
		printf("Nice\n");
	}
	return 0;
}

运行结果…

在这里插入图片描述

我们看到,程序运行结果,是死循环了,那么为什么会这样呢?

让我们调式观察吧⬇️⬇️⬇️

  1. 我们可以看到已经调式起来,并且可以在监视窗口看到i和arr的值
    在这里插入图片描述
  2. 下一步,到了for循环,for遍历数组,把数组的全部下标都改为了0,那么这时候数组还没有越界访问, 但是,for循环并没有到此结束,当我们继续会发生什么呢?
    在这里插入图片描述
  3. 当我继续时,这时候已经是越界访问了,并且把arr[10],arr[11],也改成了0,但是这时的for循环还没有结束,那么我再继续会发生什么❓❓❓
    在这里插入图片描述
  4. 那么我再继续,也就是最后一次for循环了
    在这里插入图片描述
    看下面动图,我进行最后一次for循环,arr[12]也是改为了0,突然 i 变量变为了0,并且与arr[12]的值是一样的了,这是为什么❓难道它们的地址是一样的吗❓
    在这里插入图片描述
  5. 当我把arr[12]与 i 的地址打开看看,可以发现它们的地址是一模一样的。
    在这里插入图片描述
    为了更为详细的解释,我们通过画图的方式进行讲解⬇️⬇️⬇️

分析:

  1. 首先整型变量i和整型数组arr,它们都是局部变量,那么局部变量是存放在栈区的,而栈区上内存的使用习惯是先使用高地址的空间再使用低地址的空间
  2. 那我们知道,栈区是存放局部变量和形式参数;堆区是存放动态内存开辟,如malloc,calloc,realloc,free;静态区是存放全局变量和由static修饰的静态变量。
  3. 我们可以把上面代码中它们在栈区的内存布局画出来
    我们通过该图,可以看到代码在栈区的内存布局,前边我们解释了,栈区是先使用高地址再使用低地址,我们按照创建变量的先后,分别把它们在内存布局画了出来,数组的地址是连续存放的并且是由低地址到高地址,
    那么通过不断的遍历数组,当arr[9]改为0时,这时候并没有越界访问,但是遍历还没结束,再次进行,arr[10],arr[11]都被改为了0,这已经是越界访问了,当再一次越界访问,看下图,这时arr[12]访问到了i 。所以,i 与 arr[12] 的地址是相同,既然地址相同,那么它们的值都是一样的,所以当i不断的++,arr[12]的值也跟着++,当arr[12] = 0 时,i也变为了0,最终不断的死循环。那么大家可能会有所疑惑,有这么巧吗❓
    在这里插入图片描述
  4. 我们看到 i 和 arr 中间空了2个int,其实这并不是巧合,至于它们中间空多大,取决于编译器的实现,在vc6.0中,相同的代码,i 和 arr 之间没有空隙;在gcc 中,i 和 arr 之间空1个int;在vs中空2个int 。

👋🏻结束语🌹


非常感谢您花时间阅读我的博客,希望我的分享能为您带来收获。如果您对本文有任何想法或疑问,欢迎在评论区留言交流。如果您喜欢我的博客,请继续关注,我会定期更新更多精彩内容。最后,别忘了行动起来的力量,让我们一起实践这些方法,见证自己的成长和进步!

再见,祝您生活愉快!


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中国版Sora?快手「可灵」到底行不行?

“可灵”与Sora有相似的技术架构&#xff0c;生成的视频动作流畅、幅度大&#xff0c;对物理世界理解力与还原度很高。可生成120秒、每秒30帧的高清视频&#xff0c;分辨率高达1080p&#xff0c;并且支持多种不同的屏幕比例。 “中国版SORA”到底是不是名副其实&#xff1f;能…

谷歌浏览器124版本Webdriver驱动下载

查看谷歌浏览器版本 在浏览器的地址栏输入&#xff1a; chrome://version/回车后即可查看到对应版本(不要点击帮助-关于Google chrome&#xff0c;因为点击后会自动更新谷歌版本) 114之前版本&#xff1a;下载链接 ​​​​​​123以后版本&#xff1a;下载链接&#xff0…

【机器学习】通用大模型VS垂直大模型,你更加青睐哪一方?

目录 前言AI大模型的战场&#xff1a;通用与垂直的分化通用大模型&#xff1a;广泛适用的利器垂直大模型&#xff1a;深入领域的利器谁能够形成绝对优势&#xff1f;结语通用大模型文章推荐 前言 AI大模型的战场正在分化&#xff1a; 通用大模型在落地场景更广泛毋庸置疑&…

idea插件开发之实现设置信息持久化存储

写在前面 在idea中设置的信息&#xff0c;我们重启idea后&#xff0c;这些信息还是在的&#xff0c;这其实是通过idea插件的持久化存储功能实现的&#xff0c;本文一起来看下如何实现。 1&#xff1a;正戏 为了方便测试&#xff0c;首先定义如下的ui: 我们需要在代码中给按…

干货分享:宏集物联网HMI通过S7 MPI协议采集西门子400PLC数据

前言 为了实现和西门子PLC的数据交互&#xff0c;宏集物联网HMI集成了S7 PPI、S7 MPI、S7 Optimized、S7 ETH等多个驱动来适配西门子200、300、400、1200、1500、LOGO等系列PLC。 本文主要介绍宏集HMI通过S7 MPI协议采集西门子400PLC数据的操作步骤&#xff0c;其他协议的操作…

C++入门 string的模拟实现

目录 再谈swap string常见接口模拟实现 构造函数 & 析构函数 拷贝构造 & 赋值运算符重载 begin迭代器 & end迭代器 size & swap & clear & c_str operator[ ] & reserve push_back & append operator & find insert & erase…

计算机网络之网络层知识总结

网络层功能概述 主要任务 主要任务是把分组从源端传到目的端&#xff0c;为分组交换网上的不同主机提供通信服务。网络层传输单位是数据报。 分组和数据报的关系&#xff1a;把数据报进行切割之后&#xff0c;就是分组。 主要功能&#xff1a; 路由选择与分组转发 路由器…

openh264 编码器源码分析:WelsCodeOneSlice 函数

介绍 功能&#xff1a;openh264 编码每个 slice 的核心函数原型&#xff1a; int32_t WelsCodeOneSlice (sWelsEncCtx* pEncCtx, SSlice* pCurSlice, const int32_t kiNalType)参数&#xff1a; pEncCtx&#xff1a;指向编码上下文结构体sWelsEncCtx的指针&#xff0c;包含编…

gpt、llama大模型模型结构细节探索

参考&#xff1a; https://github.com/naklecha/llama3-from-scratch&#xff08;一定要看看&#xff09; https://github.com/karpathy/build-nanogpt/blob/master/play.ipynb 视频&#xff1a; https://www.youtube.com/watch?vl8pRSuU81PU https://tiktokenizer.vercel…

Vitis HLS 学习笔记--移除内存分配malloc

目录 1. 简介 2. 示例解析 2.1 源码解释 2.2 malloc 分析 2.3 替代方案分析 3. 总结 1. 简介 Vitis HLS 也不支持动态创建或删除 C/C 对象&#xff08;用于综合&#xff09;。 本文探究如何在C/C代码中避免使用显式的malloc函数来分配内存。在硬件设计和FPGA开发中&…

b站视频下载到电脑本地mp4格式,b站视频下载到手机相册

有时候我们想把网站上的视频下载到电脑或手机&#xff0c;其实有多种方法可供选择。本文将详细介绍几种常见的下载方式&#xff0c;并探讨它们的优缺点&#xff0c;帮助读者根据自己的需求选择最适合的下载方法。 方法一&#xff1a; 1、使用 "小白兔视频格式在线转换网站…

LogicFlow 学习笔记——3. LogicFlow 基础 节点 Node

节点 Node LogicFlow 内置了一些基础节点&#xff0c;开发者在实际应用场景中&#xff0c;可以基于这些基础节点&#xff0c;定义符合自己业务逻辑的节点。 认识基础节点 LogicFlow是基于svg做的流程图编辑框架&#xff0c;所以我们的节点和连线都是svg基本形状&#xff0c;…

中电联系列四:rocket手把手教你理解中电联协议!

分享《慧哥的充电桩开源SAAS系统&#xff0c;支持汽车充电桩、二轮自行车充电桩。》 电动汽车充换电服务信息交换 第4部分&#xff1a;数据传输与安全 Interactive of charging and battery swap service information for electric vehicle Part 4:Data transmission and secu…

nosql数据库的特点

NoSQL简介 NoSQL是一种不同于关系数据库的数据库管理系统设计方式,是对非关系型数据库的统称,它所采用的数据模型并非传统关系数据库的关系模型,而是类似键/值、列族、文档等非关系模型。NoSQL数据库没有固定的表结构,通常也不存在连接操作,也没有严格遵守ACID约束。因此…

Redis高性能原理:Redis为什么这么快?

目录 前言&#xff1a; 一、Redis知识系统观 二、Redis为什么这么快&#xff1f; 三、Redis 唯快不破的原理总结 四、Redis6.x的多线程 前言&#xff1a; Redis 为了高性能&#xff0c;从各方各面都进行了优化。学习一门技术&#xff0c;通常只接触了零散的技术点&#xff…

用ChatGPT 4o画漂亮的燃尽图代码

把代码给ChatGPT&#xff0c;然后他就会帮我生成出来了。 而且图是动态的&#xff0c;可以调整颜色文字之类的内容 # Given data for Sprint 5 Progress data_sprint_5 {User Story: [BEAN-40, BEAN-42, BEAN-41, BEAN-22, BEAN-33, BEAN-44, BEAN-10, BEAN-26, BEAN-37, BEA…

【学术小白成长之路】03三方演化博弈(基于复制动态方程)均衡点与稳定性分析

从本专栏开始&#xff0c;笔者正式研究演化博弈分析&#xff0c;其中涉及到双方演化博弈分析&#xff0c;三方演化博弈分析&#xff0c;复杂网络博弈分析等等。 先阅读了大量相关的博弈分析的文献&#xff0c;总结了现有的研究常用的研究流程&#xff0c;针对每个流程进行拆解。…

Sqlite3入门和c/c++下使用

1. SQLite3基本介绍 1.1 数据库的数据类型 1.2 基本语法 1. 创建数据表格 create table 表名(字段名 数据类型&#xff0c; 字段名 数据类型)&#xff1b; create table student(id int, name varchar(256), address text, QQ char(32)); 2. 插入数据 insert into 表名 valu…

手机流畅运行470亿参数大模型,上交大发布PowerInfer-2推理框架,性能提升29倍

苹果一出手&#xff0c;在手机等移动设备上部署大模型迅速成为行业焦点。 目前&#xff0c;移动设备上运行的模型相对较小&#xff08;苹果的是3B&#xff0c;谷歌的是2B&#xff09;&#xff0c;并且消耗大量内存&#xff0c;这在很大程度上限制了其应用场景。 即使是苹果&…

运营商二要素核验-手机号机主姓名核验接口-运营商二要素核验接口

通过电信运营商验证手机号码与姓名是否一致。广泛用于实名注册、风控审核等场景&#xff0c;如电商、游戏、直播、金融等需要用户实名认证的场景。支持携号转网核验。 更新周期&#xff1a;联通T1 电信T3 移动T3~5 均为工作日 接口地址&#xff1a; https://www.wapi.cn/api_de…