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的内存,用零或其他东西填充它
- 不使用
后缀,是POSIX保留的\u t
- 我没有测试这些