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

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);
}
  1. 数组越界访问:main函数中固定定义数组arr[3],但输入的n可能大于3,写入或访问超出数组范围的内存,直接触发内存错误(zsh abort)。
  2. 采样逻辑完全错误:
    • 初始打印arr[1]不符合需求(示例应从第一个元素索引0开始);
    • 循环中s = s*i会让步长指数级增长,导致访问的数组索引远超数组长度,进一步触发越界;
  3. 输出格式混乱:没有处理括号,元素间逗号也不符合要求。

修复后的代码

#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:06:31