c中的双链表从函数发送数据

时间:2017-06-14 23:31:15

标签: c

这是我的代码: -

typedef struct Frame
{
    char* name;
    unsigned int duration;
    char* path;  // may need to scan (with fgets)
}frame_t;

typedef struct Link
{
    frame_t* frame;
    struct Link* next;
}link_t;

void addNewFrame(void)
{
  link_t* newLink = (link_t**)malloc(sizeof(link_t*));
  printf("                *** Creating new frame ***\n\n");
  printf("Please insert frame path:\n");

  //  newLink->frame->name = (char*)malloc(sizeof(char) * MAX_LEN);

  fgets(newLink->frame->name, MAX_LEN,stdin);
  printf("%s", newLink->frame->name);
}

我只需要在" Frame"中添加一个数据到name变量。链接列表,请通过查看此代码来帮助我。

2 个答案:

答案 0 :(得分:1)

您想在此处分配正确的类型: -

link_t* newLink = malloc(sizeof(link_t));  //Pointer to Link st
if(newLink){
    newLink->frame = malloc(sizeof(frame_t)); //Pointer to frame member
    if(newLink->frame){
        newLink->frame->name = malloc(sizeof(char) * MAX_LEN); //Pointer to name member
        if(newLink->frame->name){
            //Rest of your code
        }
    }
}

编辑: -
1.正如注释中所指出的那样,不需要转换malloc()返回的指针 2.另一个非常重要的一点是,您可能希望在取消引用之前检查指针的有效性

答案 1 :(得分:0)

首先。您不需要投放void *,因此(link_t **)malloc(...只能malloc(...

二。您为指针而不是结构分配了足够的内存。我认为您的意思是malloc(sizeof(link_t)),或者更好malloc(sizeof(*newLink))

第三个newLink->frame是指针,因此您需要为其分配数据,newLink->frame = malloc(sizeof(frame_t))

第四个newLink->frame->name仍然是一个指针,所以你也需要为它分配数据。 newLink->frame->name = malloc(MAX_LEN)

你正在做的混乱很常见。当您说type *something时,您正在向堆栈中的type分配指针。指针需要指向其他地方或NULL,否则会发生坏事。这也适用于结构。如果您的结构有指针成员,则需要将其指向其他位置。其他地方是真正的"类型"对象驻留。

这也适用于数组。如果你说' int foo [10]'你在堆栈中分配十个整数。如果你说int *foo[10]你在堆栈中分配十个指针。如果你说int **foo你正在堆栈中分配一个指针。同样,所有指针都需要初始化,我的意思是,它们需要指向一些有效的对象,在内存中的其他地方分配。

我希望这会有所帮助。

其他一些观点。

  • 始终检查来自malloc的指针,如果分配失败,您将收到NULL。取消引用NULL将破坏您的程序。
  • 始终初始化来自malloc的内存,用零填充它。
  • 不要使用_t后缀,保留POSIX。
  • 我没有测试任何一个。