动态数组代码不断崩溃

时间:2011-11-09 16:02:41

标签: c

这是一个非常简单的C程序,我无法弄清楚它崩溃的原因:

int main () {

    size_t argc = 2;
    char **argv = malloc(argc * sizeof(char *));
    for (int i = 0; i < 20; i++) {
        if (i >= argc) {
            argc *= 2;
            argv = realloc(argv, argc);
        }
        argv[i] = strdup("hello world!");
    }

    for (int i = 0; i < 20; i++) {
        printf("argv[%d] = \"%s\"\n", i, argv[i]); // it crashes on this line
        free(argv[i]);
    }

    free(argv);
}

2 个答案:

答案 0 :(得分:6)

       argv = realloc(argv, argc);

尺寸错误;你需要argc * sizeof(*argv)

答案 1 :(得分:3)

当你执行realloc时,你为N个字符分配空间而不是N个指向char的指针。

然后再说一次,鉴于你只想要20个项目的空间,为什么不开始为20个项目分配空间,将数据放在那里,并完成它?

#define size 20
char **argv = malloc(size * sizeof(char *));
if (argv == NULL) {
    fprintf(stderr, "Allocation failed!");
    return 1;
}
for (int i=0; i<size; i++)
    argv[i] = strdup("hello world!");

另请注意,realloc可以/将在发生故障时返回空指针,因此您通常希望执行以下操作:

char **temp = realloc(old_ptr, new_size);
if (temp != NULL)
    old_ptr = temp;