C语言数组逆序打印代码运行报编译警告,请求排查修复
C语言逆序打印数组代码的错误排查与修复
原代码
#include <stdio.h> void rev_array(int array[], int n); int main(){ int n; printf("Enter the number of elements in the array:"); scanf("%d", &n); int array[n]; for(int i=0; i<n; i++){ printf("Enter the element %d:", i+1); scanf("%d", &array[i]); } rev_array(array[n], n); return 0; } void rev_array(int array[], int n){ for(int i=(n-1); i>-1; i--){ printf("%d", array[i]); } }
编译警告信息
Test_Code.c: In function 'main':
Test_Code.c:17:15: warning: passing argument 1 of 'rev_array' makes pointer from integer without a cast [-Wint-conversion]
rev_array(array[n], n);
^~~~~
Test_Code.c:3:6: note: expected 'int *' but argument is of type 'int'
void rev_array(int array[], int n);
^~~~~~~~~
错误原因分析
- 调用
rev_array函数时,第一个参数传了array[n],这是数组的第n+1个元素(数组索引从0开始,合法索引范围是0到n-1),属于int类型的值。 - 但
rev_array函数的第一个参数要求的是int *类型(C语言中int array[]等价于int *array),也就是数组的指针/数组名,这里类型不匹配导致警告,同时会导致函数内部访问错误的内存地址,程序行为异常。
修复后的代码
#include <stdio.h> void rev_array(int array[], int n); int main(){ int n; printf("Enter the number of elements in the array:"); scanf("%d", &n); int array[n]; for(int i=0; i<n; i++){ printf("Enter the element %d:", i+1); scanf("%d", &array[i]); } // 修复:传递数组名array,而非array[n] rev_array(array, n); return 0; } void rev_array(int array[], int n){ printf("Reversed array: "); for(int i=(n-1); i>=0; i--){ // 每个元素后加空格,提升可读性 printf("%d ", array[i]); } printf("\n"); }
额外优化说明
- 修复了参数传递错误,将
array[n]改为array,正确传递数组指针。 - 在逆序打印时添加了提示文本和元素间的空格,让输出更易读。
- 将循环条件
i>-1改为i>=0,语义更清晰,效果一致。
内容的提问来源于stack exchange,提问作者Shashank Gupta
相关产品推荐
相关产品推荐

