C scanf перезаписывает глобально объявленный массив структур - PullRequest
0 голосов
/ 18 октября 2018

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

Глобальное объявление структуры и массива структур

struct Node {
    int number;
    char *string;
};


struct Node nodes[50] = {{ 0 }};

... некоторые операции с узлами в массиве ...

вставкаfunction

void insert(char *string, int number)
{
nodes[lastIndex].number = number;
nodes[lastIndex].string = string;

Теперь я сканирую строку в бафф

char buff[20]

while (scanf("%s", buff) > 0)
    {
        if (!strcmp(buff, "print"))
            printf("%s", printhighest());
        else
        {
            scanf("%s %d", buff, &number);
            insert(buff, number)
        }
    }

Каждый раз, когда применяется первое условие, строка char * в массиве структуры получаетперезаписывается строкой «print» на каждом элементе массива.

Он изменяется сразу после запуска цикла while после scanf("%s", buff)

Так что, когда я хочу напечатать, он выглядит примерно так:

узел [0] - число (10) - строка («печать»)
узел [1] - число (25) - строка («печать»)
и так далее ...

И, кстати, я не могу изменить цикл while.

Спасибо за помощь.

1 Ответ

0 голосов
/ 18 октября 2018

Проблема в этой строке:

nodes[lastIndex].string = string;

Имейте в виду, что char* не является строкой как таковой, а фактически является только указателем на некоторый массив символов, расположенный где-то в памяти.

При указанном выше назначении все узлы указывают на одно и то же место в памяти buff, таким образом, все узлы видят в точности один и тот же текст, написанный там - который получит «print», когда вы, наконец, захотите напечатать:

buff  <----------------
            |    |     |
nodes[0].string  |     |
      nodes[1].string  |
          nodes[2].string
            .
             .
              .

Чтобы решить эту проблему, вам нужно создать новую память для строк и скопировать содержимое buff в;проще всего сделать с помощью функции strdup:

nodes[lastIndex] = strdup(buff);

В качестве альтернативы, дублировать строку уже снаружи:

insert(strdup(buff), number);

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

...