遇到问题我在结构上双指针分配内存

问题描述 投票:3回答:3

我试图为指针分配内存,但必须是指针的地址的引用。我仍然很新的C,这是我第一次用双指针的工作真的。所以,我有两个结构,它们是这样的:

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));

但我一直这样做遇到分割故障。可能是什么问题?谢谢!

c segmentation-fault dynamic-memory-allocation
3个回答
3
投票

问题是与

*(myStruct->ptrToElements) ....

声明。提领myStruct->ptrToElements之前,您需要确保它指向一个有效的内存。

为了详细说明,你myStruct分配内存。精细。

构成为成员ptrToElements分配存储器。好。

  • 问:什么是ptrToElements点?
  • 答:不确定的。

所以,当您尝试取消引用指向一个不确定的内存地址的指针,这几乎是无效的内存地址,并尝试这样做将调用未定义的行为。

解决方法:您需要为myStruct->ptrToElements分配内存,你可以继续前进,取消对它的引用之前。

话说回来,请参阅do I cast the result of malloc?


-1
投票

您定义的结构包含一个指向指针listElement

typedef struct {
   listElement **ptrToElements;
} myStruct;

作为Sourav戈什写道,尝试将值赋给指针,其中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


-1
投票

我认为这是你想要什么:

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);
© www.soinside.com 2019 - 2024. All rights reserved.