【问题标题】:How can I declare and initialize an array of pointers to a structure in C?如何在 C 中声明和初始化指向结构的指针数组?
【发布时间】:2011-02-08 04:26:45
【问题描述】:

我在 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;
}

【问题讨论】:

    标签: c null pointers malloc structure


    【解决方案1】:

    这里:

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

    您正在声明一个包含 10 个指针的数组,这些指针指向指向您的结构的指针。你想要的是一个指向你的结构的 10 个指针的数组:

    list_node_t *array[10] = {NULL};
    

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

    你也不需要在这一行使用解引用操作符:

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

    因为 C 用括号表示法为您取消引用它。所以应该是:

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

    【讨论】:

    • 这是一个很好的答案,除了array 不是“真的是指向指针的指针”。 array 实际上是一个数组,而不是任何类型的指针。在表达式中使用数组类型时,会被评估为指向数组第一个元素的指针,但数组仍然是真正的类型,与指针不同。 sizeof array 应该有助于说服您 array 不是指针。
    • 而不是 array[0] = (list_node_t*) malloc(sizeof(list_node_t)); 应该是 array[0] = malloc(sizeof(list_node_t)); 不要对 malloc 调用进行类型转换。
    • 只有数组的第一个元素是指针,它的特殊指针称为**self指针”它实际上是常量self指针,它指向第一个元素以跟踪数组的起始地址。
    【解决方案2】:

    list_node_t **array[10] = {NULL}; 行是错误的 - 在这里您声明 指向列表节点指针的指针数组。替换为:

    list_node_t *array[10] = { NULL };
    

    它应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 2012-07-27
      相关资源
      最近更新 更多