如何将一个指针指向堆上的指针?

时间:2019-04-10 07:10:44

标签: c

在将指针重新引用为指针时遇到一些麻烦。我有一个放入堆中的节点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

3 个答案:

答案 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先前分配的内存。

希望这可以为您解决任何结论。