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

C语言动态分配int数组报错求助:命令行参数转存失败

问题分析与代码修正

嗨,我来帮你排查这段代码的问题~你的核心问题出在指针的解引用与偏移操作上,还有一处可以简化的冗余代码,我一步步给你拆解:

1. 指针操作的核心错误

你写的 **(a + i - 2) 是错误的:

  • a 是 int** 类型(指向int指针的指针),a + i -2 会按照 int* 的字节大小偏移地址,而不是你想要的数组元素(int)的字节大小,这会导致内存访问越界或者赋值到错误的位置。
  • 正确的做法是先解引用 a 得到动态分配的数组首地址(int* 类型),再对这个首地址进行索引偏移,比如用 (*a)[i-2] 或者 *(*a + i - 2) 都可以。

2. 不必要的字符串复制

你用 strcpy 把 argv[i] 复制到 temp 里再转整数完全是冗余操作,atoi 可以直接接收 argv[i] 这个字符串指针,直接用 atoi(argv[i]) 就能完成转换,能大幅简化代码。

修正后的完整代码

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

void read(int **a, int argc, char *argv[]) {
    int i;
    // 分配对应大小的内存,argc-2是要存储的整数个数
    if((*a = malloc(sizeof(int) * (argc - 2))) == NULL){
        fprintf(stderr, "Memory allocation failed.\n");
        exit(-1);
    }
    for (i = 2; i < argc; i++){
        // 正确的数组元素赋值方式
        (*a)[i - 2] = atoi(argv[i]);
    }
}

// 可选:添加测试用的主函数验证功能
int main(int argc, char *argv[]) {
    int *arr = NULL;
    // 先做参数合法性检查
    if (argc < 3) {
        fprintf(stderr, "Usage: %s <filename> <num1> <num2> ...\n", argv[0]);
        return 1;
    }
    read(&arr, argc, argv);
    // 打印验证结果
    for (int i = 0; i < argc-2; i++) {
        printf("arr[%d] = %d\n", i, arr[i]);
    }
    free(arr); // 记得释放动态分配的内存,避免泄漏
    return 0;
}

额外注意事项

  • 一定要记得在使用完动态分配的数组后调用 free 释放内存,避免内存泄漏。
  • 建议添加参数合法性检查(比如判断 argc 是否大于等于3),防止用户输入参数不足时出现非法内存访问。

内容的提问来源于stack exchange,提问作者Antonino DG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:14:29