C语言中的结构列表

C语言中的结构列表,c,list,C,List,我想创建一个包含跟随FIFO的人员结构的列表。 我创建了一个只有2个元素的列表。问题是当我打印列表时。即使我创建了两个元素,它也会打印三个元素 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct element element ; struct person { char name[25], family[25]; int age ; }; stru

我想创建一个包含跟随FIFO的人员结构的列表。 我创建了一个只有2个元素的列表。问题是当我打印列表时。即使我创建了两个元素,它也会打印三个元素

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

typedef struct element element ;

struct person {
    char name[25], family[25];
    int age ;
};

struct element {
    struct person p;
    element *next ;
};

struct List{
    element *first;
};

int main()
{
    int n=2,i;
    element *pre, *actuel, *e;
    struct List *l=malloc(sizeof(l));

    for(i=0;i<n;i++)
    {
        e=malloc(sizeof(e));
        e->next=NULL;
        printf("give name:\n");
        scanf("%s",e->p.name);
        printf("give family name:\n");
        scanf("%s",e->p.family);
        printf("donner l'age :\n");
        scanf("%d",&e->p.age);
        if(i==0)
        {
            l->first=e;
            pre=e;
        }else{
            pre->next=e;
            pre=e;
        }

    }

   actuel=l->first;
   while(actuel!=NULL)
   {
        printf("age is : %d \n",actuel->p.age );
        printf("name is : %s \n",actuel->p.name );
        printf("family name is : %s \n",actuel->p.family );
        actuel=actuel->next;
   }

    return 0 ;
}
#包括
#包括
#包括
typedef结构元素;
结构人{
字符名称[25],家族[25];
智力年龄;
};
结构元素{
结构人p;
元素*下一个;
};
结构列表{
元素*第一;
};
int main()
{
int n=2,i;
元素*pre、*actuel、*e;
结构列表*l=malloc(sizeof(l));
对于(i=0;不精确=NULL;
printf(“给出名称:\n”);
scanf(“%s”,e->p.name);
printf(“给出姓氏:\n”);
scanf(“%s”,e->p.family);
printf(“唐纳年龄:\n”);
scanf(“%d”,&e->p.age);
如果(i==0)
{
l->first=e;
pre=e;
}否则{
pre->next=e;
pre=e;
}
}
actuel=l->第一;
while(actuel!=NULL)
{
printf(“年龄是:%d\n”,actuel->p.age);
printf(“名称是:%s\n”,actuel->p.name);
printf(“姓氏为:%s\n”,actuel->p.family);
actuel=actuel->next;
}
返回0;
}
请问哪里有问题

谢谢。

第一个错误是

struct List *l=malloc(sizeof(l));
应该是

struct List *l=malloc(sizeof(struct List));
因为l是指向结构的指针,指针的大小是固定的(取决于体系结构,与它们指向的对象无关)

同样的错误后来实际上是问题的根源:

e=malloc(sizeof(e));
应该是

e=malloc(sizeof(struct element));

您必须为结构大小分配,而不是为指向结构大小的指针分配

sizeof(l)
将返回指向结构的指针的大小,而
sizeof(*l)
将返回实际结构的大小,其中
l
是结构的类型

更换这些部件

struct List *l = malloc(sizeof(l));
e = malloc(sizeof(e));
致:

你们也可以用下面的方法来做,但上面的例子更通用,避免了将来的问题

struct List *l = malloc(sizeof(struct List));
e = malloc(sizeof(struct element));

你认为(e)的尺寸是多少是元素的大小吗?提示:它不是元素的大小。在我的C代码标准中,尽管语言可能允许,但给typedef元素与结构相同的名称会导致混淆和问题-总是使用不同的名称,例如typedef struct element元素;您是否确实尝试过通过调试器运行它?这是错误的称为调试。在现实生活中,名字或姓氏的最大长度是多少?哈哈。这只是为了测试@barnyThank你的评论,但问题仍然是一样的为什么要麻烦malloc列表?只有一个,只需声明一个列表l;避免了使用malloc-to-be带来的痛苦、恶化和引入错误的风险避免。我喜欢这个家伙如何抓取一个解决方案,并将其作为他们的解决方案呈现出来,从而成为被接受的解决方案。是的!就是这样。多亏了我个人,我更愿意让OP自己解决这类问题,最好是通过分解问题或更多地使用调试器检查问题,而不是将问题交给他处理盘子。
struct List *l = malloc(sizeof(struct List));
e = malloc(sizeof(struct element));