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
相关产品推荐
相关产品推荐

