我该怎样在C语言中声明和初始化一个结构体指针数组?

16

我有一个简单的 C 作业。我正在尝试创建一个结构体指针数组。我的问题是如何将每个指针初始化为 NULL?此外,当我为数组成员分配内存后,我无法向数组元素指向的结构体赋值。

#include <stdio.h>
#include <stdlib.h>

typedef struct list_node list_node_t;

struct list_node
{
   char *key;
   int value;
   list_node_t *next;
};


int main()
{

   list_node_t *ptr = (list_node_t*) malloc(sizeof(list_node_t));

   ptr->key = "Hello There";
   ptr->value = 1;
   ptr->next = NULL;

   // Above works fine

   // Below is erroneous 

   list_node_t **array[10] = {NULL};      

   *array[0] =  (list_node_t*) malloc(sizeof(list_node_t));
    array[0]->key = "Hello world!";  //request for member ‘key’ in something not a structure or union
    array[0]->value = 22;            //request for member ‘value’ in something not a structure or union 
    array[0]->next = NULL;           //request for member ‘next’ in something not a structure or union


    // Do something with the data at hand
    // Deallocate memory using function free 

   return 0;
}
2个回答

21

这里:

list_node_t **array[10] = {NULL};

你声明了一个包含10个指向指针的数组,指向这个结构体。但是你需要的是一个包含10个指向该结构体的指针的数组:

list_node_t *array[10] = {NULL};

这很令人困惑,因为在C语言中,array确实是一个指向指针的指针,但方括号表示法将其抽象化了,因此您应该将array视为指针数组。

在这一行中,您也不需要使用解引用运算符:

*array[0] =  (list_node_t*) malloc(sizeof(list_node_t));
因为C语言使用方括号表示法已经帮你解引用了,所以应该这样写:

因为 C 语言使用方括号表示法已经帮你解引用了。所以应该是:

array[0] =  (list_node_t*) malloc(sizeof(list_node_t));

5
这是一个很好的回答,除了array不是 "真正的指向指针"。array实际上是一个数组,而不是任何类型的指针。当表达式中使用数组类型时,会将其评估为指向数组第一个元素的指针,但数组仍然是一种实际的类型,与指针不同。sizeof array应该有助于让你相信array不是指针。 - caf
1
不要使用强制类型转换,应该将 array[0] = (list_node_t*) malloc(sizeof(list_node_t)); 改为 array[0] = malloc(sizeof(list_node_t)); - James H
数组中只有第一个元素是指针,它是一种特殊的指针,称为“自身指针”。实际上,它是一个常量自身指针,用于跟踪数组的起始地址。 - Haseeb Mir

4

这行代码 list_node_t **array[10] = {NULL}; 是错误的 - 这里声明了一个指向链表节点指针的指针数组。将其替换为:

list_node_t *array[10] = {NULL};
list_node_t *array[10] = { NULL };

并且它应该可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接