2011-05-14 92 views
1

realloc的奇怪的錯誤我有一個代碼:在VS 2010

#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 
#include <string.h> 

typedef struct NOTE 
{ 
    char NAME[50], 
     TELE[30]; 
    int BDAY[3]; 
} NOTE; 

void AddNote(NOTE * Notes, int NotesCount, NOTE * Temp) 
{ 
    Notes = (struct NOTE *) realloc(Notes, (NotesCount + 1) * sizeof(struct NOTE)); 
    memcpy(Notes + NotesCount, Temp, sizeof(struct NOTE)); 
} 

void main() 
{ 
    int NotesCount = 0, i = 0, f = 0; 
    int a; 
    NOTE * BLOC_NOTE, * Temp; 

    Temp = (struct NOTE *) malloc(sizeof(struct NOTE)); 
    BLOC_NOTE = (struct NOTE *) calloc(0, sizeof(struct NOTE)); 

    for(i = 0; i < 4; i++) 
    { 
     ShowInputDialog(Temp); 
     AddNote(BLOC_NOTE, NotesCount++, Temp);  
    } 
} 

在BLOC_NOTE的第三個要素,程序崩潰的

Notes = (struct NOTE *) realloc(Notes, (NotesCount + 1) * sizeof(struct NOTE)); 

VS說,我說,Windows操作系統的啓動斷點...

怎麼了?

編輯
從註釋

void ShowInputDialog(NOTE * Temp) 
{ 
    printf("Name: "); 
    scanf("%s", (*Temp).NAME); 
    printf("Telephone: "); 
    scanf("%s", (*Temp).TELE); 
    printf("Birthday: "); 
    scanf("%d\.%d\.\%d", (*Temp).BDAY, ((*Temp).BDAY + 1), ((*Temp).BDAY + 2)); 
} 
+0

看起來沒問題,所以錯誤必須在其他地方,比如'ShowInputDialog'。這是做什麼的? – 2011-05-14 17:15:38

+0

'void ShowInputDialog(NOTE * Temp) { \t printf(「Name:」); \t scanf(「%s」,(* Temp).NAME); \t printf(「Telephone:」); \t scanf(「%s」,(* Temp).TELE); \t printf(「Birthday:」); (* * Temp).BDAY + 1),(((* Temp).BDAY + 2)); }' – Chaak 2011-05-14 17:17:45

+0

我不確定我能否解碼日期的格式字符串。這究竟意味着什麼?如果輸入與預期完全不符,會發生什麼? – 2011-05-14 17:36:52

回答

2

這是錯誤的:

void AddNote(NOTE * Notes, int NotesCount, NOTE * Temp) 
{ 
    Notes = (struct NOTE *) realloc(Notes, (NotesCount + 1) * sizeof(struct NOTE)); 
    memcpy(Notes + NotesCount, Temp, sizeof(struct NOTE)); 
} 

注意的是,握着你的第一個NOTE對象的地址局部變量。但是當函數返回時,該值就會丟失。你必須返回新值,因爲C沒有引用:

NOTE* AddNote(NOTE * Notes, int NotesCount, NOTE * Temp) 
{ 
    Notes = (struct NOTE *) realloc(Notes, (NotesCount + 1) * sizeof(struct NOTE)); 
    memcpy(Notes + NotesCount, Temp, sizeof(struct NOTE)); 
    return Notes; 
} 

for(i = 0; i < 4; i++) 
{ 
    ShowInputDialog(Temp); 
    BLOC_NOTE = AddNote(BLOC_NOTE, NotesCount++, Temp);  
} 

在C++就足夠了:

void AddNote(NOTE * &Notes, int NotesCount, NOTE * Temp) 
{ 
    Notes = (struct NOTE *) realloc(Notes, (NotesCount + 1) * sizeof(struct NOTE)); 
    memcpy(Notes + NotesCount, Temp, sizeof(struct NOTE)); 
} 
+0

另一種解決辦法是通過'NOTE **'到'AddNote()'(並相應地調整使用)。 – 2011-05-14 18:04:03

+0

謝謝你,它工作:) – Chaak 2011-05-14 18:11:55

0

搬到這裏來的代碼你是檢查(),釋放calloc()從malloc返回的指針值需要和realloc()。你在哪裏做過這些檢查?

+0

我可以在輸入後打印這些值。與他們一切順序..但程序崩潰在第三realloc ...(或VS) – Chaak 2011-05-14 17:23:44

2

好了,現在我已經想通了。

void AddNote(NOTE * Notes, int NotesCount, NOTE * Temp) 
{ 
    Notes = (struct NOTE *) realloc(Notes, (NotesCount + 1) * sizeof(struct NOTE)); 
    memcpy(Notes + NotesCount, Temp, sizeof(struct NOTE)); 
} 

AddNote參數NotesBLOC_NOTE副本。如果realloc成功地擴展該塊,那沒關係。但是,如果realloc分配一個新塊(並在那裏複製所有內容),BLOC_NOTE突然無效,因爲它現在指向釋放內存。

下次調用AddNode時,內存調試器顯然會檢測到這一情況。