>我正在尝试为指针分配内存,但引用了该指针的地址。我对 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));
但是我这样做一直遇到分段错误。可能是什么问题?谢谢!
问题出在
*(myStruct->ptrToElements) ....
陈述。在取消引用myStruct->ptrToElements
之前,您需要确保它指向有效的内存。
详细说明,您为myStruct
分配内存。好。
这构成了为成员分配内存ptrToElements
。好。
问题:
ptrToElements
指向什么?答:不确定。
因此,当您尝试取消引用指向不确定内存地址的指针时,它几乎是无效的内存地址,并且尝试这样做将调用未定义的行为。
解决方案:您需要为myStruct->ptrToElements
分配内存,然后才能继续取消引用它。
话虽如此,请看我是否投出了马洛克的结果?
定义结构以包含指向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
.
我认为这就是你想要的:
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);