コードを掘り下げる前に、実際の質問に対する短い答え:
... 返されるリストが NULL である理由 ...
返されるリストはありません。結果を渡すために使用したりreturn
、out パラメーターの値を設定したりしません。
編集したコードで:
void createList(struct nodo_ **Lista){
struct nodo_ *Aux_List = list_D;
aux_List = malloc(sizeof(struct nodo_));
最初Aux_List
に の現在の値に設定しますがLista
、これはまだ初期化されていないことがわかっています。これは、初期化しようとしているからです。次に、その値を破棄aux_List
し、 によって返された新しいアドレスで上書きしますmalloc
。には何も保存しません*Lista
。これが、この関数が宣言どおりに機能する唯一の方法です。
Ed が示唆しているように、typedef には多くの有用な情報が隠されているので、展開してみましょう
struct nodo {
char* dato;
struct nodo *next;
};
/*Def list */
void createList(struct nodo* list_D);
これで、これが間違っていることがわかります。createList
リストのヘッド ノードを渡すことはできますが (これはとにかく使用しません)、新しく割り当てられたリストを呼び出し元に返す方法はありません。
率直に言って、createList
とにかく有用なプリミティブではないため、最初に賢明な基盤から始めます。
struct nodo *alloc_nodo(char *dato, struct nodo *next)
{
struct nodo *n = malloc(sizeof(*n));
n->dato = dato;
n->next = next;
return n;
}
さて、これを使って書き直す前に、今createList
何をするか見てみましょう:
void createList(struct nodo *list_D)
{
struct nodo *aux_List = list_D;
aux_List = malloc(sizeof(struct nodo_));
/* ^ so, we take the input argument and immediately discard it */
char* path_a = "Hello";
char* path_B = "Minasan";
/* Store */
aux_List->dato = path_a;
aux_List = Aux_List->next;
/* ^ note that we haven't initialized aux_List->next yet,
so this is a random pointer value */
aux_List = malloc(sizeof(struct nodo_));
/* again, we set aux_List to something,
but immediately overwrite and discard it */
aux_List->dato = path_b;
aux_List->next = NULL;
}
そのため、入力を無視し、出力を返さず、互いに接続されていない部分的に初期化された 2 つのノードをリークします。私はあなたがこのような何かをもっと達成したかったと信じています:
struct nodo* create_my_list()
{
struct nodo *tail = alloc_nodo("Minasan", NULL);
/* the end (tail) of the linked list has a NULL next pointer */
struct nodo *head = alloc_nodo("Hello", tail);
/* the head of the linked list points to the next node */
return head;
/* like a snake, you hold a singly-linked list by the head */
}
この関数を使用するように記述main
すると、次のようになります。
int main()
{
struct nodo *head = create_my_list();
struct nodo *n;
for (n = head; n != NULL; n = n->next)
{
printf("The date is %s\n ", n->dato);
}
}