0

我不知道为什么返回的列表是NULL,这是代码:

在我的 List.h

struct nodo_ {
    char* dato;

    struct nodo_ *next;
};
struct nodo_ *Lista;
/*Def list */
void createList(struct nodo_ **Lista);

在我的 main.c

struct nodo_ *Lista;

int main(){
    createList(Lista);
    while(Lista != NULL){        
         printf("The date is %s\n  ",Lista->dato); //Error here now
         Lisa = Lista->next;
    }

    return 0 ;
}

在我的 List.c 中创建列表:

void createList(struct nodo_ *Lista){
    struct nodo_ *Aux_List = list_D;
    aux_List = malloc(sizeof(struct nodo_));

    char* path_a = "Hello"; 
    char* path_B = "Minasan";

    /* Store */
    aux_List->dato = path_a;
    aux_List = Aux_List->next;    
    aux_List = malloc(sizeof(struct nodo_));
    aux_List->dato = path_b;
    aux_List->next = NULL;

}

谢谢。

4

2 回答 2

3

该指针是按值传递的,即制作了一个副本。如果您希望将指针初始化为一个全新的值,那么您必须使用另一个间接级别(即 a nodo_**)。

附带说明一下,typedefing 指针类型几乎总是一个坏主意,除非该类型确实不透明(您的类型不是)。当您考虑代码中的另一个错误时,此“规则”的一个原因很明显:

auxList = (Lista*)malloc(sizeof(Lista));

您正在为指向 的指针分配空间,而对于对象noda_来说还不够。noda_此外,不要malloc在 C 中强制转换的返回值。这是多余的,因为 avoid*被安全且隐式地转换为任何其他指针类型,如果您忘记包含stdlib.hmalloc将被假定为返回的函数int,并且强制转换隐藏错误。(仅适用于实现 C89 或更早版本的编译器)

编辑:

在函数中初始化指针参数:

void init(struct node **n) {
    if(n)
        *n = malloc(sizeof(struct node));
}

int main() {
    struct node *n;
    init(&n);
}
于 2012-08-11T21:01:27.930 回答
1

在我深入研究代码之前,对您的实际问题的简短回答:

...为什么返回的列表为 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;
}

因此,它忽略了它的输入,不返回输出,并泄漏了两个未相互连接的部分初始化的节点。我相信您想要实现更多类似的目标:

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);
    }
}
于 2012-08-11T21:42:08.197 回答