C语言自定义数组反转函数多次运行后首尾出现随机值是什么原因?
问题根因
你编写的reverse_array函数存在差一错误(off-by-one error),for循环的终止条件写错了:
for (reverse_index = size - 1; reverse_index > 0; reverse_index--)
当前的reverse_index > 0条件会让循环在reverse_index等于0时直接终止,完全漏掉了原数组下标为0的元素。这就导致输出的result数组的最后一个位置(下标为size-1)始终没有被赋值,保留了栈内存分配时的随机脏值,也就是你看到的32760这类异常值。
首次调用看似正常只是巧合:要么是第一次分配reversed数组时,栈上对应最后一个位置的脏值刚好和预期数值一致,要么是你第一次调用的print_array没有打印完整100个元素,掩盖了问题。连续多次调用后,不同栈位置的脏值不同,就会出现不同的异常值。
修复方案
只需要把for循环的终止条件改成reverse_index >= 0即可,确保原数组下标为0的元素也能被正常复制:
void reverse_array(int array[], int* result, int size) { int index = 0; int reverse_index; for (reverse_index = size - 1; reverse_index >= 0; reverse_index--) { result[index] = array[reverse_index]; index++; } }
小提示
边界判断错误是C语言开发中非常常见的低级错误,后续遇到类似的内存异常值问题时,可以优先检查数组遍历的起止条件是否覆盖了所有需要访问的下标。
内容的提问来源于stack exchange,提问作者user14007170
相关产品推荐
相关产品推荐

