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)时崩溃。另一种修复方法是将注释**
传递到添加注释()
(并相应调整使用)。另一种修复方法是将注释**
传递到添加注释()
(并相应调整使用)。