我想,一旦您在内存位置上使用free(),该内存就会返回内存,如果您在释放该位置后写入该位置,这将是未定义的行为?这是我老师的密码。有人能解释一下他在做什么吗?我不明白他为什么要给刚刚被释放的记忆写信。谢谢!
void initialize(char ***subjects, char***courses, int **CRNs, int *size)
{
int i;
*subjects = (char**) malloc (INITIAL_COURSE_SIZE * sizeof(char*));
*courses = (char**) malloc(INITIAL_COURSE_SIZE * sizeof(char*));
*CRNs = (int*) malloc(INITIAL_COURSE_SIZE * sizeof(int));
for(i = 0; i < INITIAL_COURSE_SIZE; i++)
{
(*subjects)[i] = (char*) malloc(SUBJECT_SIZE * sizeof(char));
(*courses)[i] = (char*) malloc(COURSE_SIZE * sizeof(char));
} // for i
*size = INITIAL_COURSE_SIZE;
} // initalize()
void resize(char ***subjects, char***courses, int **CRNs, int *size)
{
int i, *CRNs2, size2 = *size * 2;
char **subjects2, **courses2;
subjects2 = (char**) malloc (size2 * sizeof(char*));
courses2 = (char**) malloc(size2 * sizeof(char*));
CRNs2 = (int*) malloc(size2 * sizeof(int));
for(i = 0; i < *size; i++)
{
subjects2[i] = (*subjects)[i];
courses2[i] = (*courses)[i];
CRNs2[i] = (*CRNs)[i];
} // for i
free(*subjects); //WHY DOES HE FREE THIS??????
free(*courses);
free(*CRNs);
*subjects = subjects2;
*courses = courses2;
*CRNs = CRNs2;
for(; i < size2; i++)
{
(*subjects)[i] = (char*) malloc(SUBJECT_SIZE * sizeof(char));
(*courses)[i] = (char*) malloc(COURSE_SIZE * sizeof(char));
} // for i
*size = size2;
} // resize()
此外,如果我要做:
char **a;
a = (char*)malloc(sizeof(char*) * 100);
a是否指向整个数组a[]?例如,一个[0]和一个[1]。。。将是字符指针。是指向malloc'dchar*的整个块,还是只指向[0]?谢谢我真的很感激你的帮助!!
resize
函数基本上会调整给定内存块的大小,使其大小为其大小的两倍(size2 = *size * 2
)
正在发生以下情况:
- 为调整大小的块分配新内存
- 指向科目、课程和CRN的指针被复制到新的内存中
- 旧的存储块被释放。这不会释放旧内存块所指向的块!因此,新列表仍然指向有效(未删除)块
- 新块的附加部分被初始化(通过用新分配的主题和课程数据内存填充它们的指针)
请注意,所有函数参数都包含一个额外的*
,因此会"返回"新的内存块和大小(并且可以在应用程序的其余部分中使用)。
关于你在上的第二个问题
char **a;
a = (char*)malloc(sizeof(char*) * 100);
CCD_ 4是长度为100的CCD_只有列表被分配,列表上的项目是未定义的指针。要初始化这些项目,您也可以使用:
for(int i = 0; i < 100; i++) {
a[i] = malloc(SIZE_OF_CHAR);
}
现在,所有项目都指向一个大小为SIZE_OF_CHAR
的char*
。