C语言关于栈区溢出的问题!!!某公司曾笔试问题
发布日期:2023-09-14 13:18:44 浏览次数:26 分类:技术文章

本文共 667 字,大约阅读时间需要 2 分钟。

曾经某公司校招笔试时曾出过的相关类型的题:

这段代码在编译时,会出现什么问题呢?原因是什么?

#include 
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 bit\n"); } return 0;}

1.这段代码会在运行时,出现死循环的问题。

因为数组大小是10,有10个数字,而循环需要导出的数组大小为12,这样数组11和数组12的数字在内存中是并不存在的。详情请先看图片

从图片来说,数组arr和i 都是作为变量存储在栈区中。因为在编译器中存储变量习惯是从高地址往低地址给变量开括地址,但由于数组内的内容是下标从小到大,地址也是从低到高。这样就会导致最终多余出的数组内容会超出编译器本来给数组扩充出来的地址,最终接触到变量 i 的地址,由于这题是在VS2022,debug,x86的状态下编译,所以在arr[12]的时候数组接触到 i 变量的地址,并且将其覆盖,此时 i 变量 和 arr【12】变成同一个变量,在循环将arr[12]变为0的同时,i 也 变为0,

这样就导致了循环一直重复导致了死循环。

2.在不同编译器下,这个变量的储存位置是不同的

这里是在VS2022,debug,x86的情况下进行编译的,但如果在不同的编译器中,这个数值会改变,但总体的解释是不变的

 

转载地址:https://blog.csdn.net/a1275174052/article/details/132041024 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:C语言冒泡排序
下一篇:c语言关于1.三角形判断的代码2.九九乘法表99乘法表的代码

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年09月24日 14时39分22秒