Попытка создать массив указателей узлов, используя динамическое распределение памяти - PullRequest
0 голосов
/ 12 февраля 2019

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

typedef struct {
  int data;
} myNode;

В функции гдеЯ пытаюсь создать свой массив указателей на узлы, я пишу что-то вроде (предположим, у меня есть список myList всех узлов):

myNode** aryPtr = malloc(sizeof(myNode*)) * numItemsInList);

и для каждого места я выделяю память для указателяделать:

int inc = 0;
int z = 0;
aryPtr[inc] = malloc(sizeof(myNode));
aryPtr[inc] = &(myList[z]);
inc += 1;
z += 1;

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

1 Ответ

0 голосов
/ 12 февраля 2019

Эти две строки немного проблематичны:

aryPtr[inc] = malloc(sizeof(myNode));
aryPtr[inc] = &(myList[z]);

Первое назначение

aryPtr[inc] = malloc(sizeof(myNode));

выделяет память и заставляет aryPtr[inc] указывать на эту память.Но следующее присваивание

aryPtr[inc] = &(myList[z]);

отбрасывает результат вызова malloc и переназначает aryPtr[inc], чтобы указать куда-то еще.Это приводит к утечке памяти.

Это похоже на простую переменную int и присвоение ее несколько раз:

int a;
a = 5;
a = 10;

А потом удивляетесь, почему a не равен 5.

Чтобы решить эту проблему, либо отбросьте первое присвоение с помощью malloc и получите только

aryPtr[inc] = &myList[z];  // Make aryPtr[inc] point to myList[z]

или разыменуйте указатель назначения, чтобы скопировать структуру:

aryPtr[inc] = malloc(sizeof(myNode));
*aryPtr[inc] = myList[z];  // Copy the structure itself

Другая пара вещей:

С кодом, который вы показываете (вам действительно нужно предоставить Минимальный, Полный и Проверяемый пример ), он выглядит как вы 'всегда используйте индекс 0 для aryPtr и myList.Вы также используете один и тот же индекс как для aryPtr, так и для myList, поэтому для этого вам нужна только одна переменная.

...