C语言for循环内赋值后数组值异常问题求助
解决C语言数组分割时循环后值异常的问题
Hey Alex, 我一眼就看出你代码里的问题啦——这是C语言里新手很容易踩的数组越界访问坑,和你熟悉的Python/JS自动处理数组边界的逻辑完全不一样!
问题根源
看你给右半部分数组赋值的代码块:
else { unsorted_rs[i] = unsorted_array[i]; printf("Current value of original array: %i\n", unsorted_rs[i]); printf("Currently assigned value of right half: %i\n\n", unsorted_array[i]); }
当原数组长度为奇数(比如你例子里的9),ls_len是4,循环里的i会从4开始递增到8,但unsorted_rs的长度只有5,它的有效索引范围是0到4。你直接用i作为unsorted_rs的索引,相当于往unsorted_rs[4]、unsorted_rs[5]、unsorted_rs[6]...这些超出数组范围的内存地址写数据。
C语言没有数组越界的运行时检查,这种操作会直接破坏栈上的其他内存区域(比如刚好覆盖了左边数组unsorted_ls的内容),所以循环内打印时数据还没被覆盖,看起来正常,但循环结束后内存已经被乱改,输出自然就不对了。
修正方案
给右半部分数组赋值时,需要把i转换为右数组的本地索引——用i - ls_len就能得到从0开始的正确索引:
修正后的循环代码:
for (int i = 0; i < size_of_arr; i++) { if (i < ls_len) { unsorted_ls[i] = unsorted_array[i]; printf("Current value of original array: %i\n", unsorted_array[i]); printf("Currently assigned value of left half: %i\n\n", unsorted_ls[i]); } else { int rs_index = i - ls_len; // 关键:转换为右数组的合法索引 unsorted_rs[rs_index] = unsorted_array[i]; printf("Current value of original array: %i\n", unsorted_array[i]); printf("Currently assigned value of right half: %i\n\n", unsorted_rs[rs_index]); } }
额外提醒
C语言的数组是静态内存结构,大小一旦确定就不能改变,而且必须严格控制索引在0到数组长度-1的范围内。这和Python/JS的动态数组逻辑差异很大,也是C语言内存操作需要格外谨慎的原因~
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

