web-dev-qa-db-ja.com

Cの構造体へのポインターの配列を宣言して初期化するにはどうすればよいですか?

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;
}
13
user246392

ここに:

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));
13
Jeremy Ruten

この線 list_node_t **array[10] = {NULL};が間違っています-ここで宣言しますリストノードへのポインタへのポインタの配列。これを次のものに置き換えます。

list_node_t *array[10] = { NULL };

そしてそれはうまくいくはずです。

2