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

c中的双链表从函数发送数据,c,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* newL

这是我的代码:-

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”链接列表中添加一个data to name变量,请帮助我查看此代码。

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

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.另一个非常重要的问题是,您可能需要先检查指针的有效性,然后再取消引用它们。您不需要强制转换
void*
,因此
(链接**)malloc(…
只能是
malloc(…

第二,您为指针分配了足够的内存,而不是为结构分配了足够的内存。我想您的意思是
malloc(sizeof(link))
或者更好的
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的内存,用零或其他东西填充它
  • 不使用
    \u t
    后缀,是POSIX保留的
  • 我没有测试这些

一点也不知道你在问什么。“不成功”是什么意思?有错误吗?分配内存时给我错误我猜不需要-但不想与OP的原始代码有太大差异