在C中动态分配int数组

时间:2018-04-16 18:20:23

标签: 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);
    }
}

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

1 个答案:

答案 0 :(得分:2)

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

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)。然后将字符串解析为整数与命令行处理的特殊性相隔离,从而提供更清晰指定和可重用的单元。