这种重新分配方法是不是正确[重复]
Posted
技术标签:
【中文标题】这种重新分配方法是不是正确[重复]【英文标题】:Is this reallocation method correct [duplicate]这种重新分配方法是否正确[重复] 【发布时间】:2017-12-08 15:37:37 【问题描述】:我的代码有效,但我的问题是这种动态分配是否正确。它运行良好,一切正常,但我不太确定它是否正确。
StudentDynamic* pStudents = NULL;
char auxfirstName[255], auxlastName[255];
float auxGrade;
FILE* pFile = fopen("InitialDB.txt", "r");
if (pFile == NULL)
printf("Could not open file or is empty! Exiting...");
exit(2);
int i = 0;
pStudents = (StudentDynamic*)malloc(sizeof(StudentDynamic) * 1);
while (!feof(pFile))
fscanf(pFile, "%s", auxfirstName);
pStudents[i].firstName = (char*)malloc(strlen(auxfirstName) + 1);
strcpy(pStudents[i].firstName, auxfirstName);
fscanf(pFile, "%s", auxlastName);
pStudents[i].lastName = (char*)malloc(strlen(auxlastName) + 1);
strcpy(pStudents[i].lastName, auxlastName);
fscanf(pFile, "%f", &auxGrade);
pStudents[i].grade = auxGrade;
i++;
pStudents = (StudentDynamic*)realloc(pStudents, sizeof(StudentDynamic) * (i + 1));
nStudents = i;
fclose(pFile);
【问题讨论】:
Please see this discussion on why not to cast the return value of malloc() and family in C.. Please see Why is “while ( !feof (file) )” always wrong? 为什么不用strdup
而不是malloc+strcpy?
如果它是正确的,也许 corereview 会是一个更好的获取 cmets 的地方。
我投票结束这个问题,因为它属于codereview.stackexchange.com
【参考方案1】:
temp_pStudents = realloc(pStudents , sizeof(StudentDynamic) * (i + 1));
if (!temp_pStudents)
// error
pStudents = temp_pStudents ;
理想情况下应该是这样的。否则,如果发生错误,您会出现内存泄漏。这也使您免于取消对空指针的引用。
还有其他的东西包括
强制转换malloc
,这是不必要的。
并使用带有while(!feof(file))
的构造。不要使用它。查看评论中发布的讨论。
【讨论】:
temp_pStudents应该如何声明? @Bogdy.:StudentDynamic *temp_pStudents
.
现在我崩溃了。请您检查一下是否需要? pastebin.com/kFGLRN54
@Bogdy.: 你的代码有未定义的行为。 fflush(stdin)
等...对其进行更改或提出适当的问题,甚至最好买一本书。以上是关于这种重新分配方法是不是正确[重复]的主要内容,如果未能解决你的问题,请参考以下文章