“节点”的奇怪行为

时间:2012-12-22 22:38:04

标签: c malloc

我很困惑!尝试创建动态链表并希望通过“malloc”函数指定标题。从我的代码下面编译器给出了2个错误:

在main中: [错误] node' undeclared (first use in this function) and **In function newnode':** [错误]`node'未声明(首次在此函数中使用)

#include <stdio.h>
#include <stdlib.h>

struct node{
    int a,b,c,d;
    struct node *next;
};

struct node * newnode(int, int, int, int);

int main(){
    struct node *header;
    header=(struct node *)malloc(sizeof(node));
    int a,b,c,d;
    a=11;
    b=2;
    c=4;
    d=5;
    header->next=newnode(a,b,c,d);
    printf("\n\n");
    system("PAUSE");
    return 0;
}

struct node * newnode(int aa, int bb, int cc, int dd)
{
    struct node *temp;
    temp=(struct node*)malloc(sizeof(node));
    temp->a =aa;
    temp->b =bb;
    temp->c =cc;
    temp->d =dd;
    temp->next=NULL;
    return temp;
}

我感谢任何建议!谢谢!

3 个答案:

答案 0 :(得分:2)

没有类型node。您有struct node类型,这是您需要传递给sizeof运算符的类型。

答案 1 :(得分:1)

首先,正如@icepack已经注意到的那样,类型名为struct node,而不是node。因此,sizeof(node)无法编译。您在代码中的所有地方都仔细使用struct node,但sizeof这两个地点除外。

其次,考虑使用

T *p = malloc(n * sizeof *p); /* to allocate an array of n elements */

用于内存分配的习惯用法。例如。在你的情况下

temp = malloc(sizeof *temp);

即。不要转换malloc的结果,而是更喜欢将sizeof表达式一起使用,而不是使用类型名称。类型名称属于声明。其余代码应尽可能与类型无关。

答案 2 :(得分:1)

如前面的答案所述,您必须在引用结构时使用struct node

但是,如果您只想使用声明性名称节点,则可以执行以下操作:

typedef struct _node{
    int a,b,c,d;
    struct _node *next;
}  node;

在您引用struct

之前,您无需使用node

编辑:错误的语法