我发现了一些类似的问题,但也有一些不同。
这是我的代码:
学生h:

#define NUM_GRADES 5
#define NAME_LENGTH 21
#define ADDRESS_LENGTH 21
    typedef struct
{
    char name[NAME_LENGTH]; //name of a student - up to 20 chars.
    char add[ADDRESS_LENGTH]; //address - up to 20 chars.
    int grades[NUM_GRADES]; //stores the grades of a student.
}student;

//the current size of the students array.
extern int currentTotal;

//add a new student space, return 0 if failed, 1 if succeeded.
int addStudent(student **studentClass);

学生丙:
    int addStudent(student **studentClass)
{
    //adds the count for the new student.
    currentTotal++;
    //a temporary pointer to hold studentClass array in case realloc fails.
    student *temp=NULL;
    //reallocating space for the new student.
    if (!(temp = (student*)realloc(*studentClass, currentTotal * sizeof(student))))
    {
        printf("Not enough memory.\n");
        free(*studentClass);//free the original array.
        currentTotal = 0;
        return 0;
    }
    *studentClass = temp;//point class to the newly allocated space.
    printf("Added space for a student.\n");
    return 1;
}

主要c:
#include <stdio.h>
#include <stdlib.h>
#include "student.h"
void main()
{
    student *studentClass=NULL;
....
if(addStudent(&studentClass)
....

currentTotal是一个外部int变量。
使用realloc是否正确?
免费的使用呢?
当我把指针的地址发送到另一个函数时,我总是混淆是否应该在函数内部使用*或**。(例如,有一个类似于*studentClass的指针,然后将&studentClass发送到另一个函数)。
如果这确实是正确的,那么*studentClass指向行之前的原始数据会发生什么情况
“*studentClass=temp;”(在student.c中)?
需要释放它吗?
编辑:
请不要混淆最初的*studentClass是空的,就像在开始时一样,addStudent()是循环调用的,所以在第一次之后,*studentClass不再是空的。addStudent()在每次调用后增加*studentClass的大小。
谢谢。

最佳答案

这是“保存”,因为它不会引入未定义的行为,也不会泄漏内存。注意,如果realloc失败,原始数据将不会被释放(您也会这样做),并且您将realloc的结果存储在一个临时变量中,以避免丢失指向原始数据的指针。到目前为止一切都还好。
但是,如果addStudent失败,它包含了realloc调用方的陷阱。在这种情况下,释放原始内存块而不提供新的内存块,但不会将指针重置为NULL。所以传递给addStudent的变量仍然指向一些内存,但是这个内存已经被释放。调用方可能会再次尝试释放此内存(然后会产生未定义的行为)。
如果realloc失败,我建议根据谁负责释放学生的数组内存,选择两种方法之一:
a.addStudent负责:释放原始内存并将指针设置为NULL,这样外部任何人都无法尝试两次释放内存。所以你可以在*studentClass=NULL后面加上一个free
b.调用方负责:在发生realloc故障时,不要释放原始内存;返回-如您所做-一个故障代码,并让调用方执行其余操作。所以你要删除free

关于c - 函数内部使用realloc正确吗? (以及在失败的情况下使用free()),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47857520/

10-12 20:34