Задать вопрос

Как имененить размер двумерного динамического массива?

struct Graph
{
	Node *nodes;
	int numNodes;
	float **adj;
};

void insert(Graph *graph)
{
	graph->numNodes++;
	graph->adj = (float **)realloc(graph->adj, graph->numNodes * sizeof(float*));
	for (int i = 0; i < graph->numNodes - 1; i++)
		graph->adj[i] = (float *)realloc(graph->adj[i], graph->numNodes * sizeof(float));
	graph->adj[graph->numNodes - 1] = (float*)calloc(graph->numNodes, sizeof(float));
}

void D_printGraph(Graph *graph)
{
	for (int i = 0; i < graph->numNodes; i++)
	{
		for (int j = 0; j < graph->numNodes; j++)
			printf("%f\t", graph->adj[i][j]);
		printf("\n");
	}
}


По-нормальному измененный массив должен заполняться нулями, а получается вот что (массив 2x2, то есть размер массива изменен 2 раза):
5870a15f0b8d40208815dcba6b9b5979.PNG

Для массива 1х1 выводится 0, как и должно быть.
  • Вопрос задан
  • 461 просмотр
Подписаться 1 Оценить Комментировать
Решения вопроса 2
@smozhaykin
www.cplusplus.com/reference/cstdlib/realloc

The content of the memory block is preserved up to the lesser of the new and old sizes, even if the block is moved to a new location. If the new size is larger, the value of the newly allocated portion is indeterminate.

Отсюда у Вас и мусор.

calloc работает по-другому и зануляет выделенную память.
Ответ написан
Комментировать
Mrrl
@Mrrl
Заводчик кардиганов
calloc должен заполнять нулями, это да. Но realloc не обязан заполнять нулями вновь захваченные элементы массива, это надо делать вручную.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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