@HaseProgram
Студент

Почему перезаписываются данные в структуре?

Доброго времени суток, прошу помочь со следующим вопросом.
Есть структура примерно такого вида:
struct node
{
	int Number;
	nodecoordinates* Items;
};

struct edge
{
	int Number;
	edgecoordinates* Items;
};

struct model
{
	struct node Node;
	struct edge Edge;
};

struct view
{
	struct model Model;
	// остальные поля
};


Под Items в структурах edge и node, выделял динамически:
int allocate_edges(struct view* View)
{
	View->Model.Edge.Items = (edgecoordinates*)calloc(View->Model.Edge.Number, sizeof(edgecoordinates));
	if (!View->Model.Edge.Items)
	{
		return CANT_ALLOCATE_EDGES;
	}
	else
	{
		return OK;
	}
}

int allocate_nodes(struct view* View)
{
	View->Model.Node.Items = (nodecoordinates*)calloc(View->Model.Node.Number, sizeof(nodecoordinates));
	if (!View->Model.Node.Items)
	{
		return CANT_ALLOCATE_NODES;
	}
	else
	{
		return OK;
	}
}


Далее я инициализирую еще одну структуру вида:
struct line
{
	int x1, x2, y1, y2;
};


Делаю это так:
int allocate_lines(struct line* lines, int Number)
{
	lines = (line*)malloc(Number*sizeof(struct line));
	if (!lines)
	{
		return CANT_ALLOCATE_LINES;
	}
	return OK;
}
...
struct line lines;
error = allocate_lines(&lines, View.Model.Edge.Number);

Дальше, после вызова вот этой функции (именно после ее завершения, а не во время цикла), все, что было в структуре View удаляется (вроде как смещается):
void build_lines(struct view View, struct line* lines)
{
	for (int i = 0; i < View.Model.Edge.Number; i++)
	{
		(lines + i)->x1 = (int)((View.Model.Node.Items + (View.Model.Edge.Items + i)->node1)->X);
		(lines + i)->y1 = (int)((View.Model.Node.Items + (View.Model.Edge.Items + i)->node1)->Y);
		(lines + i)->x2 = (int)((View.Model.Node.Items + (View.Model.Edge.Items + i)->node2)->X);
		(lines + i)->y2 = (int)((View.Model.Node.Items + (View.Model.Edge.Items + i)->node2)->Y);
	}

}
...
build_lines(View, &lines); // вызов
...

Почему это происходит? Заранее спасибо!
  • Вопрос задан
  • 224 просмотра
Решения вопроса 1
mbeloshitsky
@mbeloshitsky
Вебдев, систем оперейшонс, ж.д. автоматика
Вы же выделяете массив, поэтому по-моему здесь нужен указатель на указатель:

int allocate_lines(struct line** lines, int Number)
{
  lines* = (line*)malloc(Number*sizeof(struct line));
  if (!lines)
  {
    return CANT_ALLOCATE_LINES;
  }
  return OK;
}
...
struct line * lines;
error = allocate_lines(&lines, View.Model.Edge.Number);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
Отладчик должен помочь в вашей беде.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы