2017-06-14 39 views
-1

數據這是我的代碼: -雙向鏈表發送從功能

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); 
} 

我只需要在「框架」鏈接列表中添加一個數據name變量,請查看本代碼幫助我。

+1

不知道你在這裏問什麼。 「沒有成功」是什麼意思?有錯誤嗎? – OldProgrammer

+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.正如評論指出,沒有必要投()
2.另一個malloc返回指針非常不重要的一點,你可能想檢查指針的有效性,然後再去參考它們。

+1

[我投了malloc的結果?](https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – Stargateur

+0

我猜不是需要 - 但不希望與OP的原始代碼 – Zakir

+0

差異太大謝謝你的工作,你救了我! –

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保留的。
  • 我沒有測試任何這個。