我发现了一些类似的问题,但也有一些不同。
这是我的代码:
学生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/