You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言数组首元素输出异常:为何显示n与输入值之和?

数组越界引发未定义行为导致输出异常

你的代码存在两个关键问题,直接造成了输出异常:

问题原因

  1. 非法的空数组初始化
    C语言不允许int arr[] = {}这种空数组声明,编译器会将其视为大小为0的数组。后续你通过arr[i](i从1到n)访问元素时,完全超出了数组的有效内存范围,属于未定义行为——栈上相邻的变量(比如n)的内存会被意外覆盖。你看到第一个输出值为6(5+1),本质是越界访问篡改了栈上的变量值,具体表现取决于编译器的栈内存布局。

  2. 数组下标使用错误
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 10:04:51