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