Изменен адрес памяти с помощью realloc в C - PullRequest
0 голосов
/ 31 мая 2018

У меня есть вопрос о перераспределении памяти в C, потому что я думаю, что это вызывает проблему, которая у меня уже неделю, так и не найдя ее.Я, у вас есть бумага в квадрате, а ваш кто-то залил пару квадратов зеленым цветом.Итак, сейчас я пытаюсь прочитать координаты зеленых квадратов (кто-то помещает их в стандартный вывод), а затем я хотел бы связать их вместе, посмотрев, соседствуют ли они вместе.Таким образом, в структуре Cell все ячейки имеют координаты, указатели на потенциальных соседей и счетчик соседей.И есть функция setNeighbours, которая выясняет, являются ли они соседями, и заполняет адреса в каждом объекте.Так что моя проблема заключается в методе перераспределения, потому что я знаю, что это потенциально переносит адресный блок куда-то еще, и в связи с этим иногда (возможно, в 40% случаев) я получаю неправильные результаты при распечатке результатов.

Код ниже.Я знаю, что причиной является линия перераспределения, потому что, если я действительно удаляю ее и просто помещаю достаточно места в строку malloc, чтобы потом не было необходимости в realloc, тогда все работает нормально.Я предполагаю, что есть один глупый момент, когда я звоню по старому адресу, который изменился раньше, но я не вижу его.Видит ли это?

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <stdbool.h>

typedef struct Square {
    long index;
    long x;
    long y;
    struct Square *Above;
    struct Square *Below;
    struct Square *Right;
    struct Square *Left;
    int count;
} SquareType;

SquareType *cellArr;
long countSquares = 0;

Пример ввода:

1 3
2 3
3 3
2 2
2 1
3 2

1 Ответ

0 голосов
/ 31 мая 2018

Так что моя проблема связана с методом перераспределения, потому что я знаю, что это потенциально переносит адресный блок куда-то еще, и по этой причине иногда (возможно, в 40% случаев) я получаю неправильные результаты при печатирезультаты.

Действительно, realloc() не всегда помещает перераспределенный блок по тому же адресу, что и исходный.Если вы перераспределяете пространство, содержащее ваши структуры, то вы должны предположить, что любые указатели на эти структуры, полученные до перераспределения, перестают быть действительными.Ваш код, кажется, не делает этого предположения.

Существует только несколько жизнеспособных решений:

  • Не полагайтесь на указатели на выделенное пространство, кромеглавный вы поддерживаете в начале пространства.Один из способов добиться этого - идентифицировать соседей по их индексам, а не по указателям на них.Или

  • Установите указатели только после считывания всех данных, чтобы вы могли быть уверены, что все необходимые перераспределения уже выполнены.Или

    • Особый случай: пересчитать все указатели всякий раз, когда данные перераспределяются на другой адрес.Или
  • Избегайте перераспределения.Вы можете сделать это, либо выделив достаточно места для всего заранее (довольно хороший вариант, если у вас есть или можете получить хотя бы разумную верхнюю границу суммы, которая вам нужна), либо выделив каждую структуру независимо от других.

...