C语言程序查找最小值时数组末尾元素异常变更的原因咨询
数组越界引发的未定义行为导致程序异常
这是一个典型的数组越界访问导致的未定义行为问题,咱们一步步拆解原因:
数组下标规则:在C语言中,数组的下标是从0开始计数的。你声明的
int array[2]意味着这个数组只包含2个元素,合法的访问下标是array[0]和array[1]。array[2]已经超出了这个数组的内存边界——编译器只为这个数组分配了2个int大小的连续内存空间,array[2]指向的是数组末尾之后的未知内存区域。栈内存的布局影响:当你运行程序输入5、6、7时,这三个值大概率被存在了栈上的某个区域,而你的
array数组也在栈上分配空间。由于栈的内存布局是连续的,array[2]恰好指向了存储第三个输入值(7)的内存地址。当你执行查找最小值的代码段时,对array[2]进行了写操作,直接把原本存储7的内存位置改成了5。未定义行为的表现:C语言不会对数组越界做运行时检查,这种越界访问属于「未定义行为」——它可能导致各种奇怪的结果:修改其他变量的值(就像你遇到的情况)、程序崩溃、甚至在某些情况下看起来“正常运行”但埋下隐患。你看到的数组最后一个元素从7变5,就是因为越界写操作覆盖了原本存储第三个输入值的内存。
修复方案
最直接的解决方法就是把数组的长度调整为3,声明成int array[3],这样array[0]、array[1]、array[2]都是合法的访问下标,不会再出现越界问题,程序就能正确计算均值、最大值和最小值了。
内容的提问来源于stack exchange,提问作者movinton
相关产品推荐
相关产品推荐

