c - 在C中动态分配int数组

标签 c arrays memory-management int

大家好,我真的不明白为什么我写的这段代码不起作用。我需要将通过命令行传递的整数存储在要打开的文件名后面的数组中。代码如下:

void read(int **a, int argc, char *argv[]) {
    int i;
    char temp[20];

    if((*a = malloc(sizeof(int) * (argc - 2))) == NULL){
        fprintf(stderr, "Error.\n");
        exit(-1);
    }

    for (i = 2; i < argc; i++){
        strcpy(temp, argv[i]);
        **(a + i - 2) = atoi(temp);
    }
}

有人可以帮忙吗?非常感谢!

最佳答案

您可以尝试删除临时字符串变量并使用数组索引表示法进行数组访问。

void read(int **a, int argc, char *argv[])
{
    int i;

    if (argc < 3) {
        *a = NULL;
        return;
    }

    if ((*a = malloc(sizeof(int) * (argc-2))) == NULL){
        fprintf(stderr, "Error.\n");
        exit(-1);
    }

    for(i=2; i < argc; i++){
        (*a)[i - 2] = atoi(argv[i]);
    }
}

否则,数组访问应为*((*a)+i-2);即,取消引用双指针以获取数组指针,应用指针算术找到正确的元素,然后取消引用它。

此函数的更通用版本是:

int *map_atoi(int n, char * strs[])
{
    int i, *r;

    if (n < 1) return NULL;

    r = calloc(n, sizeof(int));

    if (r != NULL) {
        for(i=0; i < n; i++) {
            r[i] = atoi(strs[i]);
        }
    }

    return r;
}

它可以从 main 调用,如 a = map_atoi(argc - 2, argv + 2)。然后,将字符串解析为整数与命令行处理的特殊性隔离,从而提供更明确指定和可重用的单元。

关于c - 在C中动态分配int数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49863869/

相关文章:

iphone - UIWebView内存管理

c++ - 什么决定了堆内存的分配位置?

c - 段错误(核心转储)C 程序

C lib直接从文件流中读取和解析JSON

c - Linux Kernel 在哪里锁定和解锁信号量?

iphone - 在 NSArray 中添加字符串元素

c - 删除 C 数组中的重复数字 :

javascript - 将 192 场比赛的赛程分成 6 场比赛的周,不重复球队

c++ - C 中的全局变量不连续

java - Activity 占用 140mb 内存