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

动态创建数组反转C代码运行异常:编译正常但输入或段错误求助

C语言数组反转代码错误排查与修复

问题根源

你的代码出现段错误和输入限制的核心原因是scanf参数传递错误,另外还有几个潜在问题需要优化:

  1. 非法内存访问:scanf("%d", p[i]);中,p[i]是数组元素的数值,而scanf要求传入变量的地址。这里错误地把数值当作地址传入,导致程序写入非法内存区域,直接触发段错误。
  2. 全局变量风险:将i、j定义为全局变量,会让代码逻辑更难追踪,且容易在多场景下引发意外冲突。
  3. 变长数组的局限性:int q[n];属于变长数组(VLA),依赖栈空间分配,当n较大时容易出现栈溢出,兼容性也不如动态内存分配。
  4. 输出格式不友好:反转后的元素输出没有换行,所有内容挤在一起,可读性差。

修正后的代码

#include<stdio.h>
#include<stdlib.h>

int main(){
    int *p;
    printf("请输入数组元素个数:");
    int n; 
    if(scanf("%d", &n) != 1 || n <= 0){
        printf("输入无效,请输入正整数\n");
        return 1;
    }
    // 动态分配内存并检查分配结果
    p = malloc(n * sizeof(int));
    if(p == NULL){
        printf("内存分配失败\n");
        return 1;
    }

    // 输入数组元素,修复scanf的地址传递问题
    for (int i = 0; i < n; i++){
        printf("请输入第%d个元素:", i+1);
        scanf("%d", &p[i]);
    }

    // 打印原数组
    printf("\n原数组元素为:\n");
    for (int i = 0; i < n; i++){
        printf("%d\n", p[i]);
    }

    // 用动态内存分配代替变长数组,避免栈溢出
    int *q = malloc(n * sizeof(int));
    if(q == NULL){
        printf("内存分配失败\n");
        free(p);
        return 1;
    }
    // 反转数组
    for(int i = 0, j = n-1; i < n; i++, j--){
        q[i] = p[j];
    }

    // 打印反转后的数组,优化格式
    printf("\n反转后的数组元素为:\n");
    for (int i = 0; i < n; i++){
        printf("%d\n", q[i]);
    }
    
    // 释放所有动态分配的内存
    free(p);
    free(q);
    return 0;
}

关键修改说明

  • 修复scanf参数:将p[i]改为&p[i],确保传递的是元素的内存地址。
  • 替换全局变量:把i、j改为循环内的局部变量,提高代码安全性。
  • 替换变长数组:用malloc动态分配q的内存,避免栈溢出问题,同时增加内存分配失败的检查。
  • 增加输入校验:检查n的输入有效性,避免非法值导致后续逻辑出错。
  • 优化输出格式:添加换行和分隔提示,提升可读性。

内容的提问来源于stack exchange,提问作者Diljot Singh Baweja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 21:07:21