C 有时(随机)推送全局链表*时出错*

C 有时(随机)推送全局链表*时出错*,c,C,我创建了一个全局链接列表。它有时不起作用。第一次推送总是成功的,但第二次推送有时会出错。我在另一台电脑上试过,但还是一样 typedef struct person{ char name[20]; char surname[20]; char musical_Work[20]; int age; struct person *next; }*top; top head=NULL; /* GLOBAL */ void addNode( /* dat

我创建了一个全局链接列表。它有时不起作用。第一次推送总是成功的,但第二次推送有时会出错。我在另一台电脑上试过,但还是一样

typedef struct person{
    char name[20];
    char surname[20];
    char musical_Work[20];
    int age;
    struct person *next;
}*top;

top head=NULL;  /* GLOBAL */

void addNode(   /* datas */    ){  
    top new_node=(top)malloc(sizeof(top));

    /* copying datas */

    new_node->next=head;
    head=new_node;  
}

代码
top新_节点=(top)malloc(sizeof(top))
顶部
分配足够的空间,该顶部是指向
结构人
的指针。但是,该空间将用于容纳
struct person
,因此它必须为
struct person
分配足够的空间。因此,正确的代码为:

 top new_node=(top)malloc(sizeof(struct person));
此外:

  • 使用
    sizeof*new_node
    自动为新_节点指向的任何节点分配足够的空间,即使在编辑代码时更改了
    new_node
    的类型
  • 在C语言中,不需要强制转换
    malloc
    的类型。此代码可以是
    top new\u node=malloc(sizeof*new\u node)
  • 考虑对指向
    struct person
    的指针使用不同的名称,而不是
    top
    。它并不总是堆栈的顶部

    • 代码
      top new_node=(顶部)malloc(sizeof(顶部))
      顶部
      分配足够的空间,该顶部是指向
      结构人
      的指针。但是,该空间将用于容纳
      struct person
      ,因此它必须为
      struct person
      分配足够的空间。因此,正确的代码为:

       top new_node=(top)malloc(sizeof(struct person));
      
      此外:

      • 使用
        sizeof*new_node
        自动为新_节点指向的任何节点分配足够的空间,即使在编辑代码时更改了
        new_node
        的类型
      • 在C语言中,不需要强制转换
        malloc
        的类型。此代码可以是
        top new\u node=malloc(sizeof*new\u node)
      • 考虑对指向
        struct person
        的指针使用不同的名称,而不是
        top
        。它并不总是堆栈的顶部

      打印
      sizeof(顶部)
      sizeof(个人)
      ,然后决定要使用哪个值。您需要为person实例分配内存,而不是指针大小的4/8字节。@rafix07非常感谢!我只是想知道,如果我用“top”而不是“*top”,可以吗?@bercp。不,您不能使用
      *top
      ,因为
      top
      struct person*
      类型的别名,而不是变量。@rafix07:这是标记为C的,并且
      person
      没有
      typedef
      ,因此
      sizeof(person)
      不正确;它应该是
      sizeof(struct person)
      。但是更好的是
      malloc(sizeof*new_node)
      ,因为它为被分配的对象分配空间,即使
      new_node
      的类型后来在编辑代码的过程中被更改。@EricPostpischil是的,你完全正确,我的评论不够精确:)Print
      sizeof(top)
      sizeof(person)
      ,然后决定要使用的值。您需要为person实例分配内存,而不是指针大小的4/8字节。@rafix07非常感谢!我只是想知道,如果我用“top”而不是“*top”,可以吗?@bercp。不,您不能使用
      *top
      ,因为
      top
      struct person*
      类型的别名,而不是变量。@rafix07:这是标记为C的,并且
      person
      没有
      typedef
      ,因此
      sizeof(person)
      不正确;它应该是
      sizeof(struct person)
      。但更好的是
      malloc(sizeof*new\u node)
      ,因为它为被分配的对象分配空间,即使
      new\u node
      的类型后来在编辑代码时发生了更改。@EricPostphil是的,你完全正确,我的评论不够精确:)