Realloc устанавливает для всех индексов одинаковые данные - PullRequest
0 голосов
/ 28 апреля 2018
FILE *fd;
char **lines = NULL;

int err = fopen_s(&fd, filename, "r");

if (err != 0) {
    printf("Nao foi possivel abrir o ficheiro %s ...\n", filename);
    return;
}

char nextline[1024];
int counter = 0;

while (fgets(nextline, sizeof(nextline), fd)) {
    if (strlen(nextline) < 1) {
        continue;
    }

    lines = (char**)realloc(lines, (counter+1) * sizeof(*lines));
    lines[counter] = nextline;



    counter++;
}

fclose(fd);
*numElements = counter;

//IN HERE IT SHOWS ME THE SAME FOR ALL THE PLAYERS FROM 300 DIFFERENT PLAYERS WHY IS THAT???
printf_s("\n\n%s\n", lines[299]);
printf_s("%s\n", lines[298]);

Я не могу понять проблему.
Сначала realloc удалял старый буфер, теперь он буквально копирует одни и те же данные во все 300 индексов.

Может кто-нибудь, пожалуйста, помогите мне?

1 Ответ

0 голосов
/ 28 апреля 2018

Переменная lines - это в основном массив указателей. И все указатели в массиве указывают на первый элемент того же самого массива nextline.

Задание

lines[counter] = nextline;

только назначает указатель , он не выполняет глубокое копирование или дублирование строки, в настоящее время находящейся в nextline.

Возможно, вы захотите использовать функцию strdup вместо простого назначения указателей:

lines[counter] = strdup(nextline);

Не забудьте free строки, которые вы strdup позже.

Если вы знаете, как взаимодействуют массивы и указатели, простая отладка резиновой утки должна была сказать вам об этом всего за несколько секунд. И если вы не понимаете, что просто назначаете указатели, вам нужно вернуться к учебникам или конспектам лекций.

...