Я пытаюсь прочитать список слов для сортировки, и я начинаю с довольно небольшого массива (10 элементов), а затем хотел бы увеличить размер массива на 10, если текущей емкости недостаточно. Кажется, это работает с первым realloc, но я получаю SIGABRT при попытке снова вызвать realloc. Я уверен, что это простая вещь, которую я не вижу, но я не могу понять это. Вот моя программа:
int main(int argc, char *argv[]){
char *string = malloc(100);
// Array of pointers starting with 100 elements
char **toSort = malloc(100*sizeof(char *));
if(toSort == NULL) {
exit(1);
}
for(int i = 0; i < 100; i++) {
// Each string can be up to 100 characters long
toSort[i] = malloc(101);
if(toSort[i] == NULL) {
exit(1);
}
}
// Get all lines in the file
int counter = 0;
int max = 10;
char *toAdd;
FILE *txt = fopen("wlist0.txt", "r");
while(fgets ( string, 100, txt ) && counter < max) {;
toAdd = malloc(100);
if(toAdd == NULL) {
exit(1);
}
strcpy(toAdd, string);
toSort[counter] = string;
counter++;
//if the array needs to be enlarged
if(counter == max) {
char **new = realloc(toSort, (max+10) * sizeof(char));
if(new == NULL) {
exit(1);
}
for(int i = max; i < max + 10; i++) {
toSort[i] = malloc(101);
if(toSort[i] == NULL) {
exit(1);
}
}
toSort = new;
max += 10;
}
};
for(int i = 0; i < max; i++) {
char *word = toSort[i];
printf("%s", word);
}
for(int i = 0; i < max; i++) {
free(toSort[i]);
}
free(toSort);
return 0;
};
Как говорится в моих комментариях, мои строки имеют максимальную длину 100 символов. Я полагаю, что я мог бы также динамически выделять память для строк, но я буду беспокоиться об этом, когда у меня будет работать другой realloc. Любая помощь будет принята с благодарностью.
main()
. Это упростит чтение вашего кода! - person Ronan Boiteau   schedule 29.04.2018NULL
вfree()
была допустимой. - person alk   schedule 29.04.2018free(NULL)
, на самом деле это одно из приятных свойствfree
, когда вы освобождаете массивы динамически выделяемых указателей. - person Pablo   schedule 29.04.2018