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

C语言数组反转程序打印时出现乱码的问题咨询

C语言数组反转乱码问题原因及修复方案

核心错误原因

  • 你在调用print_array和reverse_arr函数时,传递的第二个参数sizeof(A)是错误的:sizeof运算符返回的是目标占用的总字节数,不是数组的元素个数。
  • 你定义的A是长度为5的int数组,Windows x64环境下int类型占4字节,所以sizeof(A)的返回值是5 * 4 = 20,你实际给函数传递的数组长度是20,不是你预期的5。
  • 程序循环访问了A[5]到A[19]的内存区域,这些区域属于数组边界之外的栈内存,存储的是未知的栈数据,打印出来就是你看到的乱码。

为什么首尾能看到正常内容

  • 第一次调用print_array时,前5次循环访问的是数组合法范围的元素,所以输出1、2、3、4、5,后续15次访问越界内存输出乱码。
  • 调用reverse_arr时,会把索引为i和19-i的元素交换:当i为04时,交换的是`A[0]~A[4]`和`A[19]~A[15]`,所以原数组的5个元素被交换到了索引1519的位置,第二次打印时末尾5个输出就是反转后的5、4、3、2、1。

修复方案

把main函数中调用两个函数时的第二个参数改为sizeof(A) / sizeof(A[0]),即可正确计算数组的元素个数:

int main()
{
    int A[5] = {1, 2, 3, 4 ,5};
    print_array(A, sizeof(A) / sizeof(A[0]));
    reverse_arr(A, sizeof(A) / sizeof(A[0]));
    print_array(A, sizeof(A) / sizeof(A[0]));
}

额外优化建议

你使用的异或交换写法可读性较差,且如果两个操作数指向同一块内存地址时会出现值被清零的问题,虽然当前场景不会触发该问题,但更推荐使用临时变量的方式实现交换,兼容性和可读性都更好:

int temp = A[i];
A[i] = A[N-1-i];
A[N-1-i] = temp;

内容的提问来源于stack exchange,提问作者Herrmit Busen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:27:01