#include <stdio.h>
#define SIZE 5
struct node
{ int item;
struct node *link;
};
struct linkedlist
{
struct node *head;
int count;
};
void init(struct linkedlist *p , int key)
{
struct node *newnode;
newnode = (struct node*)malloc(sizeof(struct node));
newnode->link = NULL;
newnode->item = key;
p->head = newnode;
p->count = 1;
}
void main()
{ struct linkedlist *s;
init(s , 2);
printf("%d", s->count);
}
在函数init
取消引用结构之前,必须分配结构并将其指针分配给s
。
此外,您应该在托管环境中使用标准int main(void)
,而不是void main()
,这在C89和C99或更高版本中定义的实现中是非法的,除非您有特殊原因使用非标准签名。
另一个值得注意的是,malloc()
家族的铸造结果被认为是一种糟糕的做法。
int main(void)
{ struct linkedlist *s = malloc(sizeof(*s)); /* allocate the structure */
if (s == NULL) return 1; /* check if allocation succeeded */
init(s , 2);
printf("%d", s->count);
}
免责声明:我没有释放s
,因为它只分配了一次,执行很快就结束了。该节点也不会被释放。现代操作系统不需要在程序结束时释放。(c-当你在malloc之后没有释放时,会发生什么?-堆栈溢出(你可能想添加释放来满足像Valgrind这样的内存检查器。
在调用init函数之前,需要在主函数中将内存分配给s指针。因此,解决方案是在调用init((函数之前添加以下行:
s = (struct linkedlist*)malloc(sizeof(struct linkedlist));
它应该正常工作,没有错误。快乐学习!
此程序中存在一个主要的概念错误。如果要将未初始化的指针作为参数传递,请将其初始化为至少NULL。传递空指针没有任何意义。在上面的代码中仅仅声明一个指向struct-linkedlist的指针并不能真正为您获得它的对象,除非您静态或动态地创建一个对象。指针用于存储有效的内存地址,仅仅声明指向int数据类型的指针并不能真正为您创建数据类型为int的变量。我希望最后三个声明已经清楚地表明了你的错误。然而,我已经解决了你的问题,代码如下:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
struct node
{
int item;
struct node *link;
};
struct linkedlist
{
struct node *head;
int count;
};
void init(struct linkedlist *p , int key)
{
struct node *newnode;
newnode = (struct node*)malloc(sizeof(struct node));
newnode->link = NULL;
newnode->item = key;
p->head = newnode;
p->count = 1;
}
void main()
{
struct linkedlist *s = (struct linkedlist*)malloc(sizeof(struct
linkedlist));
init(s , 2);
printf("%d", s->count);
}