这是我的代码: -
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变量。链接列表,请通过查看此代码来帮助我。
答案 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
你正在堆栈中分配一个指针。同样,所有指针都需要初始化,我的意思是,它们需要指向一些有效的对象,在内存中的其他地方分配。
我希望这会有所帮助。
其他一些观点。
_t
后缀,保留POSIX。