无法在结构中为我的双指针分配内存

时间:2019-02-05 11:44:49

标签: c segmentation-fault dynamic-memory-allocation

我正在尝试为指针分配内存,但是有对该指针地址的引用。我对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));

但是我一直遇到分段错误。可能是什么问题?谢谢!

3 个答案:

答案 0 :(得分:3)

问题出在

*(myStruct->ptrToElements) ....

声明。在取消引用myStruct->ptrToElements之前,您需要确保它指向有效的内存。

为了详细说明,请为myStruct分配内存。很好

这构成为成员ptrToElements分配内存。好。

  • 问题:ptrToElements指向什么?

  • 答案:不确定。

因此,当您尝试取消引用指向不确定性内存地址的指针时,它几乎是无效的内存地址,并且尝试这样做将调用未定义的行为。

解决方案:您需要先为myStruct->ptrToElements分配内存,然后才能取消引用。

话虽如此,请参阅do I cast the result of malloc?

答案 1 :(得分:-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);

答案 2 :(得分:-1)

您将结构定义为包含指向listElement的指针

typedef struct {
   listElement **ptrToElements;
} myStruct;

如Sourav Ghosh所写,您尝试为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