这种重新分配方法是不是正确[重复]

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) 等...对其进行更改或提出适当的问题,甚至最好买一本书。

以上是关于这种重新分配方法是不是正确[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用结构更新指针进行重新分配时出现问题[重复]

C++ While循环不重新分配字符串值

数组的内存分配[重复]

我是不是应该强制重新分配检查新块大小是不是小于初始块?

如果不是 Nil,则变量重新分配方法结果

共享内存实现上的 C++ 内存池:这种分配和释放方法是不是正确?