每日一题——在windows x86/64 VS环境下,下面的程序会出现什么问题?运行结果是什么?为什么?

本文通过一道笔试题分析了在Linux x86/64 gcc环境下,一个涉及局部变量和数组越界的C语言程序。程序会导致数组越界访问,并由于栈区内存布局,意外地修改了变量i的值,从而形成死循环。博主探讨了栈区内存使用习惯、局部变量和数组的存储位置,揭示了不同编译器和环境对此问题的不同处理方式。
摘要由CSDN通过智能技术生成

 

哈喽大家好,我是保护小周ღ,本期为大家带来的是博主在学习过程中遇到的一道笔试题,题目不难,但是有点复杂),涉及到局部变量在内存中存储的这一方面知识,还是值得学习一下的,欢迎留言啊~

这是一道笔试题,原题是在Linux x86/64 gcc环境下,博主觉得这题还是考察了很多知识点,所以写下这篇博客,给大家分享一下,解题思路。

#include<stdio.h>

int main()
{
	int i = 0;
	int arr[] = {1,2,3,4,5,6,7,8,9,10};

	for (i=0;i<=12;i++)
	{
		arr[i] = 0;
		printf("Hello World!\n");
	}

	return 0;
}

我们先以windows X86 VS2019 的环境来观察这道题:

程序会出现什么问题?

一、不考虑其他情况,这段程序会造成越界访问

二、实际上程序会造成越界访问,也会造成死循环

运行结果如下:

大多数朋友应该都知道,程序会造成越界访问,但是这是笔试题呀,怎么会这么简单呢,接下来博主来给大家分析分析程序为什么会造成死循环

首先来了解两个知识点:

  1.  变量 i 和数组 arr 都是局部变量,局部变量在内存的栈区上开辟的。
  2. 栈区内存的使用习惯:先使用高地址处的空间,再使用低地址处的空间。
  3. arr 数组在内存的栈区上开辟了一块连续的存储空间(40个字节),数组每个元素的地址根据数组的下标的增长,由低地址向高地址变化。

由程序可知,我们先定义的变量 i 后定义的数组 arr,所以他们在内存中的存储示意图为:

 数组每个元素的地址根据数组的下标的增长,由低地址向高地址变化。

此时如果数组造成了越界访问到一定的空间,是不是会访问到 变量 i 的地址啊。这个时候

 arr[ i ]=0;因为他们现在代表的是同一个地址,所以 i 的值也会重置为0,作为调整部分的 i 的值不断重置,程序自然而然会造成死循环。

相信大家应该已经能理解了吧,当然我们的编译器也会报错,这个题,考察的是你对局部变量、数组等在内存中的存储。


总结

我们在这个题遇到一些问题还没有给大家解答疑惑:

一、栈区,堆区等是操作系统这门学科对内存的划分

二、关于 i 和 arr 之间间间隔的空间

  1.  VC 6.0 中间没有多余的空间
  2.  gcc 中间间隔1个空整型空间
  3. VS 2013/2019/2022等 中间间隔2个空整型空间

当然在不同的操作系统环境下,不同的编译器,以及 x86(32位),64,也会有不同的表现。 

 

 这是64位的编译器这段程序的表现,就不会造成死循环,相信大家应该能够理解吧。


本期收录于博主的专栏——每日一题,适用于编程初学者,有兴趣的朋友们可以订阅,查看其它“精彩小题”。每日一题_保护小周ღ的博客-CSDN博客

感谢每一个观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ  *★,°*:.☆( ̄▽ ̄)/$:*.°★* 

​​

  如有侵权请联系修改删除! ​​

评论 92
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

保护小周ღ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值