C语言数组首元素输出异常:为何显示n与输入值之和?
数组越界引发未定义行为导致输出异常
你的代码存在两个关键问题,直接造成了输出异常:
问题原因
非法的空数组初始化
C语言不允许int arr[] = {}这种空数组声明,编译器会将其视为大小为0的数组。后续你通过arr[i](i从1到n)访问元素时,完全超出了数组的有效内存范围,属于未定义行为——栈上相邻的变量(比如n)的内存会被意外覆盖。你看到第一个输出值为6(5+1),本质是越界访问篡改了栈上的变量值,具体表现取决于编译器的栈内存布局。数组下标使用错误
C语言数组的下标从0开始,你从i=1开始访问arr[i],即使数组空间足够,也会浪费第一个元素的位置,同时增加越界风险。
修正后的代码
#include <stdio.h> #include <stdlib.h> int main(){ int n; printf("Enter the number of elements you want to store in an array: "); scanf("%d", &n); // 动态分配足够内存存储n个元素 int *arr = malloc(n * sizeof(int)); if(arr == NULL){ printf("Memory allocation failed!\n"); return 1; } for(int i=0; i<n; i++){ // 修正序数后缀显示 const char *suffix; ifoft #� 享有 Rel( interiorLost 体现凡(FA"C,哦,不对,修正后缀: if(i+1 == 1) suffix = "st"; else if(i+1 == 2) suffix = "nd"; else if(i+1 == 3) suffix = "rd"; else suffix = "th"; printf("Enter the %d%s element: ", i+1, suffix); scanf("%d", &arr[i]); } printf("Output:\n"); for(int i=0; i<n; i++){ printf("%d", arr[i]); } printf("\n"); free(arr); return 0; }
修正说明
- 移除了非法的空数组声明,改用
malloc动态分配内存,确保有足够空间存储n个元素,彻底避免越界问题。 - 数组下标从0开始,符合C语言标准用法。
- 修正了输入提示的序数后缀错误(如2st改为2nd)。
- 使用标准的
int main()替代非标准的void main(),添加了内存分配失败的检查,并在程序结束时释放动态分配的内存。 - 若不想使用动态分配,也可使用变长数组(VLA):
int arr[n];,但需注意VLA在C99及以后标准中支持,部分编译器需开启对应选项。
内容的提问来源于stack exchange,提问作者Nitesh Addagatla
相关产品推荐
相关产品推荐

