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是的,你完全正确,我的评论不够精确:)Printsizeof(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是的,你完全正确,我的评论不够精确:)