You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 06:57:34