C语言提取向量间隔s元素程序出现zsh abort报错问题
向量采样程序的zsh abort问题分析与修复
问题场景
需要编写程序:输入向量后返回每隔s个的元素。例如输入向量(1,2,3,4,5,6)、s=2时,输出应为(1,3,5)。但运行现有代码时出现zsh abort警告。
原代码的核心错误
#include <stdio.h> void sampleVector(double arr[], int n, int s){ int j = 0; for (j=0; j<n; j++) { arr[j] = 0; printf("%d: ",j); scanf("%lf",&arr[j]); } int i=1; printf("%f,", arr[i]); for (i=1; i<n; i++){ s=s*i; printf("%f", arr[s]); } } int main() { int n; scanf("%d", &n); double arr[3]={0,0,0}; int s; scanf("%d", &s); sampleVector(arr, n, s); }
- 数组越界访问:main函数中固定定义数组
arr[3],但输入的n可能大于3,写入或访问超出数组范围的内存,直接触发内存错误(zsh abort)。 - 采样逻辑完全错误:
- 初始打印
arr[1]不符合需求(示例应从第一个元素索引0开始); - 循环中
s = s*i会让步长指数级增长,导致访问的数组索引远超数组长度,进一步触发越界;
- 初始打印
- 输出格式混乱:没有处理括号,元素间逗号也不符合要求。
修复后的代码
#include <stdio.h> #include <stdlib.h> void sampleVector(double arr[], int n, int s){ // 输入向量元素 for (int j = 0; j < n; j++) { printf("请输入第%d个元素: ", j+1); scanf("%lf", &arr[j]); } // 输出采样结果 printf("("); for (int i = 0; i < n; i += s) { if (i != 0) { printf(", "); } printf("%.1f", arr[i]); } printf(")\n"); } int main() { int n, s; printf("请输入向量长度n: "); scanf("%d", &n); printf("请输入采样步长s: "); scanf("%d", &s); // 动态分配内存,避免固定大小导致的越界 double *arr = (double*)malloc(n * sizeof(double)); if (arr == NULL) { printf("内存分配失败\n"); return 1; } sampleVector(arr, n, s); free(arr); // 释放动态分配的内存 return 0; }
修复说明
- 使用
malloc动态分配数组内存,根据输入的n确定数组大小,彻底解决越界问题; - 采样逻辑改为从索引0开始,每次步长为s,符合“每隔s个元素”的需求(比如s=2时,取索引0、2、4...);
- 优化输入输出提示,规范输出格式为括号包裹、元素间用逗号分隔;
- 添加内存分配失败的判断,保证程序健壮性。
内容的提问来源于stack exchange,提问作者annnna
相关产品推荐
相关产品推荐

