Онлайн компилятор C

#include <stdio.h> void swap_negmax_last(int size, int a[]){ int n_save=0,t=0,s=1; while(s<size){ if(a[s]<0){ n_save=a[s]; break; }s++; } while(t<size){ if(a[t]<0&&a[t]>n_save){ n_save=a[t]; }t++; } int b=0; while(b<size){ if(a[b]==n_save){ break; }b++; } a[b]=a[size-1]; a[size-1]=n_save; for(int i=0;i<size;i++){ printf("%d ",a[i]); } return; } int main() { int a[10],n; scanf("%d",&n); for(int m=0;m<10;m++){ scanf("%d",&a[m]); } swap_negmax_last(11,a); return 0; }
这段代码的目的是在数组中找出最大的负数元素,然后把它和数组最后一个元素交换位置。但代码中存在几个问题。

首先,主函数中数组大小是10,但调用函数时传入了11,这会导致数组越界访问。同时,输入循环也固定为10次,但实际应该根据变量n来读取。

其次,在查找最大负数的逻辑中,第一个循环只找到了第一个负数,但后续比较时,如果数组中没有负数,n_save会保持为0,而0不是负数,这会导致错误判断。

- 检查函数调用时传入的大小参数是否与数组实际大小一致。数组a只有10个元素,但传入了11。
- 思考当数组中没有负数时,程序应该如何处理。目前代码中n_save初始化为0,但0不是负数,这会影响后续的比较和交换。