VS 2010中realloc的奇怪错误

VS 2010中realloc的奇怪错误,c,visual-studio,struct,realloc,C,Visual Studio,Struct,Realloc,我有一个密码: #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, NO

我有一个密码:

#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);     
    }
}
VS告诉我OS 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));
 }
您需要检查从malloc()、calloc()和realloc()返回的指针值。你在哪里检查的

您需要检查从malloc()、calloc()和realloc()返回的指针值。你在哪里检查的

这是错误的:

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));
}
Notes是一个局部变量,它保存第一个
Notes
对象的地址。但当函数返回时,该值将丢失。您必须返回新值,因为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);     
}
这是错误的:

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));
}
Notes是一个局部变量,它保存第一个
Notes
对象的地址。但当函数返回时,该值将丢失。您必须返回新值,因为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);     
}

好的,现在我已经弄明白了

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
中,参数
Notes
BLOC\u NOTE
的副本。如果realloc成功地扩展了块,那么就可以了。但是,如果realloc分配一个新块(并复制那里的所有内容),
BLOC\u NOTE
突然无效,因为它现在指向已释放的内存


下次调用AddNode时,内存调试器显然会检测到这一点。

好的,现在我已经找到了答案

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
中,参数
Notes
BLOC\u NOTE
的副本。如果realloc成功地扩展了块,那么就可以了。但是,如果realloc分配一个新块(并复制那里的所有内容),
BLOC\u NOTE
突然无效,因为它现在指向已释放的内存


下次调用AddNode时,内存调试器显然会检测到。

这看起来正常,因此错误一定在其他地方,如
ShowInputDialog
中。这是怎么做的?
void ShowInputDialog(NOTE*Temp){printf(“Name:”;scanf(%s),(*Temp.Name);printf(“Telephone:”;scanf(%s),(*Temp.TELE));printf(“birth:”;scanf(%d\.%d\.\%d),(*Temp.BDAY,(*Temp.BDAY+1),(*Temp.BDAY+2))}
我不确定我能否破译日期的格式字符串。这到底是什么意思?如果输入不完全符合预期会发生什么?我的编译器抱怨\。也它可能应该是“%d/%d/%d”或“%d.%d.%d”,具体取决于您写入日期的方式。这看起来没问题,因此错误一定在其他地方,如
ShowInputDialog
中。这是怎么做的?
void ShowInputDialog(NOTE*Temp){printf(“Name:”;scanf(%s),(*Temp.Name);printf(“Telephone:”;scanf(%s),(*Temp.TELE));printf(“birth:”;scanf(%d\.%d\.\%d),(*Temp.BDAY,(*Temp.BDAY+1),(*Temp.BDAY+2))}
我不确定我能否破译日期的格式字符串。这到底是什么意思?如果输入不完全符合预期会发生什么?我的编译器抱怨\。也它可能应该是“%d/%d/%d”或“%d.%d.%d”,具体取决于您写入日期的方式。输入后,我可以打印这些值。有了他们,一切都井然有序。。但程序在第三个realloc时崩溃…(或VS)我可以在输入后打印这些值。有了他们,一切都井然有序。。但程序在第3个realloc…(或VS)时崩溃。另一种修复方法是将
注释**
传递到
添加注释()
(并相应调整使用)。另一种修复方法是将
注释**
传递到
添加注释()
(并相应调整使用)。