Возникли проблемы с выделением памяти для моего двойного указателя в структуре - PullRequest
0 голосов
/ 05 февраля 2019

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

typedef struct myNodes {
   int data;
   struct myNodes *next;
} listElement;


typedef struct {
   listElement **ptrToElements;
} myStruct;

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

myStruct *myStruct = malloc(sizeof(*myStruct));
*(myStruct->ptrToElements) = (listElement*)malloc(sizeof(listElement));

но я продолжаю сталкиваться с ошибкой сегментации от этого.В чем может быть проблема?Спасибо!

Ответы [ 3 ]

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

Я думаю, это то, что вы хотите:

typedef struct myNodes {
   int data;
   struct myNodes *next; // not clear what this pointer is used for...
} listElement;

typedef struct {
   listElement *ptrToElements;
} myStruct;


// Memory Allocation
// allocate myStruct pointing to an array of N listElements
myStruct      *ms = malloc(sizeof(myStruct));
ms->ptrToElements = malloc(N * sizeof(listElement));

// element access
for (int i = 0; i < N; i++) {
    listElement *le = ms->ptrToElements[i];
    le->data = ...
    le->next = NULL; // not clear what this pointer is used for...
}

// Memory deallocation
free(ms->ptrToElements);
free(ms);
0 голосов
/ 05 февраля 2019

Вы определяете структуру, которая будет содержать указатель на указатель на listElement

typedef struct {
   listElement **ptrToElements;
} myStruct;

Как писал Сурав Гош, вы пытаетесь присвоить указателю значение, на которое ptrToElements будет указывать безвыделение памяти.

Возможно, вам следует изменить тип указателя на

typedef struct {
   listElement *ptrToElements;
} myStruct;

и при выделении памяти

myStruct *myStruct = malloc(sizeof(*myStruct));
/* If the list can be empty, initialize root with NULL pointer */
myStruct->ptrToElements = NULL;

/* when you add the first list element */
myStruct->ptrToElements = malloc(sizeof(listElement));
myStruct->ptrToElements->data = someValue;
/* at least for the last element you add here you should initialize next */
myStruct->ptrToElements->next = NULL;

Не забывайте обрабатывать ошибки, например, mallocвозвращение NULL.

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

Проблема с оператором

*(myStruct->ptrToElements) ....

.Перед разыменованием myStruct->ptrToElements необходимо убедиться, что он указывает на действительную память.

Для уточнения вы выделяете память для myStruct.Fine.

Это распределение памяти для члена ptrToElements.Хорошо.

  • Вопрос: На что указывает ptrToElements?

  • Ответ: неопределенный.

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

Решение : Вам нужно выделить память для myStruct->ptrToElements, прежде чем вы сможете продолжить и разыменовать ее.

сказав, что, пожалуйста, смотрите ли я приведу результат malloc?

...