код динамического массива продолжает сбоить

#c

#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);
}
  

Ответ №1:

        argv = realloc(argv, argc);
  

Размер неправильный; вы хотите argc * sizeof(*argv) вместо этого.

Комментарии:

1. Спасибо, я не знаю, почему я это пропустил. Я знал, что это должно было быть что-то действительно глупое!

Ответ №2:

Когда вы выполняете свое 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;