以前碰到过这样一道面试题:

// 请分析如下代码的执行结果。
#include <stdio.h>int main()
{int i = 0;int arr[3] = {0};for(;i<=3;i++) {arr[i] = 0;printf("Hello, World! \n");}return 0;
}

我心想,头一次面试碰到这么简单的面试题,面试官你是不是看不起我?

奋笔疾书,我写了个三行 Hello,World

可是当我自信满满的交给面试官的时候他却诡异的笑了,仿佛在说,小伙计,你太天真了,你是不是看不起我出的题?

这一笑笑得我是冷汗直冒,就跟偷偷打飞机被人发现了一样,异常尴尬。

当然,以上都是我胡诌出来的,一个面试不可能有这么多内心戏,我是一个写代码的程序员,又不是戏精,哪来那么多想法。

但是,虽然内心戏是胡诌的,可是这道面试题目确实实打实的。

接下来我们仔仔细细分析下这道题目,为了先快速得到执行结果,我们先运行一遍看看:

执行结果

可以看到,这段代码竟然无限循环了,是不是很难理解。

想分析这段代码,我们首先需要了解数组这个数据结构,简单来说:数组是用一组连续的内存空间,存储一组具有相同类型的数据的线性数据结构。

数据逻辑结构

根据数组的逻辑结构图我们可以总结出一位数组的寻址公式为:arr[i]_address = base_address + i*data_size,其中 data_size 表示每个数据的磁盘空间大小。

根据这个寻址公式,我们来对上边的代码做出寻址行为的分析,当 i = 3 时,理论上寻址公式为 arr[3]_address = arr[2]_address + i*data_size,此处需要注意的是因为 C 语言中,数组越界是一种未决行为,如果你是从事 Java 或者其他高级语言的话会发现对于数组越界是当做一种异常行为来处理的,但是 C 语言不是。对于 C 语言来说,只要不是访问受限的内存空间,所有的内存空间都是可以自由访问的,哪么根据既定寻址公式,arr[3]会被定位到某块本不属于数组的内存地址上,而这块地址恰恰存储的是我们定义的变量 i,也就是说此时 arr[3] = 0 ,相当于 i = 0 时的情况,这样就会导致无限循环。

如果i<=3改成i<3,结果才是我们想要的样子。

我们想要的结果

到此,程序的执行结果我们分析完了,但是你可能对于上边加粗的 而这块地址恰恰存储的是我们定义的变量 i 这句话有疑问,怎么就 arr[3] = 0 了呢?

这个时候我们大学学过的操作系统和计算机体系结构以及甚至可能是编译原理的知识就要排上用场啦。

我们都知道在写一个函数时会使用形参,形参实例化时会形成一份拷贝,调用这个函数时会把实参传进去,调用完之后那些临时拷贝又被释放,那么计算机在调用函数时是如何进行形参的保存和释放的呢?这个时候会用到一个叫栈的数据结构。

栈用于维护函数调用的上下文,离开了栈,函数调用就无法实现。栈是从高地址向低地址延伸的。每个函数的每次调用都有它自己独立的一个栈帧,这个栈帧中有它所需要的各种信息。

回到上边那段代码,产生死循环的第一个原因就是因为函数调用栈的特殊性:函数体内的局部变量是存在栈上的,且是连续压栈。在 Linux 进程的内存布局中,栈区在高地址空间,从高向低增长。变量 i 和 arr 在相邻地址,且 i 比 arr 的地址大,所以 arr 越界正好访问到i。当然,前提是 i 和 arr 元素要同类型,否则那段代码仍是未决行为。

还有另一个原因是因为编译器分配内存和字节对齐,我们定义 3 个元素的数组加上一个变量 i 。4 个整数刚好能满足 8 字节对齐 所以 i 的地址恰好跟着 arr[2] 后面导致死循环。如果数组本身有 4 个元素 则这里不会出现死循环。因为编译器 64 位操作系统下,默认会进行 8 字节对齐 变量 i 的地址就不紧跟着数组后面了。

通过今天这道看似简单实则还是比较复杂的题目,可以说坑很多,涉及到的知识点也不少,但恰恰这些知识点是我们大学学过的一些计算机基础知识,没有涉及任何框架,也没有任何的新技术,可很多人还是答不上来。

简言之,你别看有些人整天这框架那框架的玩的很嗨,但是它的计算机专业素养是远远不够的,职业生涯前期可能不会有什么区别,但是长远来看,掌握了基础知识的人上限势必要高一些。

从今天开始,本公众号也会更新一些计算机基础知识的专栏,自打我停止更新这段时间,我也思考了很多,总觉得每天都很焦虑,玩着手机的时候焦虑没有好好学习,学习的时候又心心念着电视剧剧情走向,今天学这个框架明天学那个框架,到头来发现不但啥都没学会,原来会的东西还给忘了。

5 月份开始,我会陆陆续续更新算法和数据结构、计算机网络、操作系统原理以及设计模式等和编程语言不强相关的一些内容,希望大家能喜欢。

往期推荐

????

IntelliJ IDEA 2020.1 稳定版发布

如果你喜欢这篇文章,欢迎在看转发

生活很美好,明天见

从一道面试题来看计算机专业基础知识的重要性相关推荐

  1. 计算机专业考试基础知识,计算机专业基础知识要点及考试考试.docx

    计算机专业基础知识要点及考试考试 PAGE PAGE 27 数据结构要点第一章 概 论数据就是指能够被计算机识别.存储和加工处理的信息的载体.数据元素是数据的基本单位,可以由若干个数据项组成.数据项是 ...

  2. 计算机专业基础知识(中)

    大纲 分专题讲解 4. 操作系统的基本概念.功能.组成及分类 概念理解 主要功能 组成和分类 主流的操作系统 推荐书籍和课程 5. Windows 操作系统的基本概念和常用术语,文件.文件夹.库等 W ...

  3. 考研科目计算机专业基础知识,考研基本常识科目及分数

    对于新手考研的同学来说,很多考研相关的知识都不是很清楚.今天沪江小编就给大家介绍介绍有关考研的基本常识:考研科目及分数,希望对大家有所帮助. 2017考研基本常识:考研科目及分数 考研科目 共四门:两 ...

  4. 计算机专业基础知识(上)

    大纲 分单元讲解 1. 计算机的发展.类型及其应用领域 计算机技术的发展 计算机应用领域 2. 计算机中数据的表示.存储和处理 3. 计算机软.硬件系统的组成及主要技术指标 计算机软.硬件系统的组成 ...

  5. 湖北省计算机专业基础知识,2012年湖北省中职对口高考计算机应用基础知识点...

    简要介绍资料的主要内容,以获得更多的关注 2012年湖北省中职对口高考计算机应用基础知识点 第一部分 计算机基础知识 1.计算机的发展和应用领域 了解计算机技术的发展过程及趋势,掌握并能列举各阶段发展 ...

  6. 事业单位考试计算机专业知识题库,事业单位考试计算机专业基础知识试卷及答案.docx...

    事业单位考试计算机专业知识试卷及答案 ? 一.单项选择题(本题型共45题,每题1分,共45分.每题给出的4个选项中,只有1个选项是符合题意的,将正确的选项选出,并在答题卡上将相应的字母涂黑.不选或错选 ...

  7. 有关计算机最基础的知识,有关计算机专业基础知识.doc

    资料来自网络,请保护知识产权,请您下载后勿作商用,只可学习交流使用. 计算机计算机的概念是一种能速高效自动完成信息处理的电子设备,它能按照程序对信息进行加工.处理.存储.二.计算机的诞生与发展1. 诞 ...

  8. 计算机专业技能知识,2017年度计算机专业技能知识资料基础知识资料试题'及其答案...

    2017年度计算机专业技能知识资料基础知识资料试题'及其答案 (19页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.90 积分 ''第一部分   一 ...

  9. 电子科大计算机考研820真题,2016年成都电子科技大学820计算机专业基础考研真题考研试题硕士研究生入学考试试题...

    电子科技大学 2016年攻读硕士学位研究生入学考试试题 考试科目:820计算机专业基础 注:所有答案必须写在答题纸上,写在试卷或草稿纸上均无效. <计算机操作系统> 一.填空题(10分,每 ...

最新文章

  1. 前端项目课程7 banner设计注意事项
  2. 在VMware Workstation中安装Ubuntu设置网络连接
  3. 《1---关于解决MySQL在控制台插入中文乱码问题》
  4. php图片生成缩略图_PHP实现生成图片缩略图函数
  5. java中属于常量_java中的常量和属性
  6. toj 4611 Repairing a Road
  7. 机器学习(七)支持向量机svm中级篇
  8. informix(南大通用)sql语法的差异
  9. 1.1 HTML5简介
  10. centos7 安装 nvm
  11. 【java学习之路】(java SE篇)005.面向对象基础入门part2
  12. silverlight:分享一个不错的自定义布局CollectionFlow(可用于制作相册的哦!)
  13. mongodb之副本集搭建
  14. 「机箱」酷冷至尊 影音先锋 250
  15. 2017华为面试算法题小结
  16. 【ffmpeg】视频解码器
  17. 利用SEQ2SEQ模型实现车牌识别
  18. mysql的pdb文件在哪里_pdb是什么文件?pdb数据库文件怎么打开?
  19. 计算机指数函数表示法,指数函数e^x的快速计算方法
  20. vs2015中提示未能找到类型或命名空间名Word

热门文章

  1. word文档批量生成工具(附免费软件)(按Excel表格内容自动替换内容生成文档)
  2. 枣庄薛城区搭建“智慧社区”便民服务解民忧
  3. QQ音乐本地下载(python爬虫)
  4. 匿名无人机飞控代码整理
  5. Streamlit+Flair开发微博情感分析应用【含源码】
  6. 什么是对抗样本、对抗攻击(详解)
  7. 另类数据的崛起——CnOpenData在行动(下)
  8. R语言进行探索性数据分析以确定影响保险公司为医疗事故诉讼支付的索赔金额的因素
  9. Photoshop学习第三课-你的证件照,红蓝白底随心换
  10. Vim使用(二)——插件管理器vundle及nerdtree和ctags插件