动态创建数组反转C代码运行异常:编译正常但输入或段错误求助
C语言数组反转代码错误排查与修复
问题根源
你的代码出现段错误和输入限制的核心原因是scanf参数传递错误,另外还有几个潜在问题需要优化:
- 非法内存访问:
scanf("%d", p[i]);中,p[i]是数组元素的数值,而scanf要求传入变量的地址。这里错误地把数值当作地址传入,导致程序写入非法内存区域,直接触发段错误。 - 全局变量风险:将
i、j定义为全局变量,会让代码逻辑更难追踪,且容易在多场景下引发意外冲突。 - 变长数组的局限性:
int q[n];属于变长数组(VLA),依赖栈空间分配,当n较大时容易出现栈溢出,兼容性也不如动态内存分配。 - 输出格式不友好:反转后的元素输出没有换行,所有内容挤在一起,可读性差。
修正后的代码
#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
相关产品推荐
相关产品推荐

