在将指针重新引用为指针时遇到一些麻烦。我有一个放入堆中的节点e
,还有另一个名为List
的节点。 List
是指向e
的指针。
出于某种原因,当我通过e
取消引用List
时出现分段错误:
struct ELEMENT{
int key;
int edge;
struct ELEMENT *adjList;
};
int numOfNodes = 3;
struct ELEMENT *e = (ELEMENT*)malloc(numOfNodes * sizeof(struct ELEMENT));
// e is now on the heap
struct ELEMENT **List = (ELEMENT**)malloc(numOfNodes * sizeof(struct ELEMENT));
// List (pointer to e) is now on the Heap
List[1]->key = 5; // segmentation fault occurs here
答案 0 :(得分:1)
正如其他人已经注意到的那样,您不需要第二个malloc
。您只希望List
指向e
,所以您所要做的就是将e
的“地址”分配给list
。
struct ELEMENT **List = &e;
此外,您尝试使用List
访问元素的方式是错误的。像这样看:
e[n]
将在索引n处访问结构ELEMENT
*List
是相同的e
因此要访问数组中的元素,您需要(*List)[n]
,要访问成员,您需要(*List)[n].key
顺便说一句:... malloc....
中的任何一个都无法编译,就像您在转换中忘记了struct
一样,但是除了添加struct
之外,只需删除转换即可。喜欢:
struct ELEMENT *e = malloc(numOfNodes * sizeof *e);
^ ^^
no cast use dereferenced pointer to calculate size
进行这些更改后,您的完整代码将为:
struct ELEMENT{
int key;
int edge;
struct ELEMENT *adjList;
};
int numOfNodes = 3;
struct ELEMENT *e = malloc(numOfNodes * sizeof *e);
struct ELEMENT **List = &e;
(*List)[1].key = 5;
答案 1 :(得分:0)
如果List
指向e
,则您不应再次调用malloc()
。您应该这样做:
struct ELEMENT **List = &e;
答案 2 :(得分:0)
此行
struct ELEMENT *e = (struct ELEMENT*)malloc(numOfNodes * sizeof(struct ELEMENT));
您不仅为struct ELEMENT
变量分配了内存,还创建了一个大小为3的数组,并键入struct ELEMENT
。
但是据您的代码了解,您想要创建一个列表并添加变量e
。可以这样做
struct ELEMENT **List = malloc(numOfNodes * sizeof(struct ELEMENT*)); //This allocate memory for 3 pointers, List[i] is type struct ELEMENT *
像这样为每个指针分配内存之后
int i;
for(i = 0; i < numOfNodes; i++)
{
List[i] = malloc(sizeof(struct ELEMENT)); //here allocate memory for each pointer, for now each List[i] is type struct ELEMENT
}
因此可以将e
的声明更改为struct ELEMENT *e = malloc(sizeof(struct ELEMENT));
并根据需要使用e
e->adjList = NULL;
e->edge = 5;
e->key = 15;
并将其添加到List
List[i] = e;
如果仅希望指针引用变量e
,则可以使用struct ELEMENT **List = &e;
或更简单的struct ELEMENT *p_elem = e;
。因此,您可以使用这些指针来更改e
成员的值。
不要忘记free
先前分配的内存。
希望这可以为您解决任何结论。