2016-04-01 116 views
3

我試圖做一個函數,接受一個預先分配的內存指針作爲輸入,並用該數據填充該位置的結構數組。在這個例子中,我期望的輸出爲:填充函數內動態分配的結構

W 100 
L 200 

然而,第一線是正確的,但第二行打印沒有字符和一個零。我究竟做錯了什麼?

typedef struct{ 
    char word; 
    long number; 
}record; 

void makerec(record** data){ 
    data[0]->word='W'; 
    data[0]->number=100; 
    data[1]->word='L'; 
    data[1]->number=200; 
} 

int main(){ 
    record* data=(record*)malloc(sizeof(record)*1000); 
    makerec(&data); 
    printf("%c %ld\n",data[0].word,data[0].number); 
    printf("%c %ld\n",data[1].word,data[1].number); 
    free(data); 
    return 0; 
} 
+0

'data [1]'訪問超出界限。你的意思是'(* data)[1] .word ='L';'等等 –

回答

4

你沒有處理正確的類型。簡單地改變:

void makerec(record** data) { 

到:

void makerec(record * data) { 

和:

makerec(&data); 

到:

makerec(data); 

以及改變data[0]->word='W';和朋友data[0].word = 'W';

data已經是一個指針,你想改變它指向的東西,所以你可以直接將它傳遞給makerec。如果你想讓makerec()指向一些不同的東西,你會傳遞一個指向data的指針,但這不是你在這裏做的,所以只要通過data本身就是正確的。

附帶您的主要問題,但:

record* data=(record*)malloc(sizeof(record)*1000); 

應該是:

record* data = malloc(1000 * sizeof *data); 
if (!data) { 
    perror("memory allocation failed"); 
    exit(EXIT_FAILURE); 
} 

注:

  1. 你並不需要(而且,我的腦海裏,不應該)施放返回值malloc()和朋友

  2. sizeof *datasizeof(record)更好,因爲如果data類型發生變化,它將繼續工作,更重要的是,它可以消除將sizeof運算符應用於錯誤類型的可能性,這是一種常見錯誤。

  3. 扭轉1000sizeof *data的位置僅僅是一種美化,使多個'*'更容易理解。

  4. 如果分配失敗,您應該始終檢查malloc()的返回值,並採取適當的措施(如退出程序)。