我正在编写代码来检查我编写的用于分配和释放内存的两个函数是否有效。这两个功能本质上是
int createBaseName(char ***imageName, char **groupName, char *name)
{
*imageName = calloc(BASELINEC, sizeof(char *)); //This is a 2D array (array of str)
*groupName = calloc(MINILINE, sizeof(char)); // This is a 1D array (just an str)
sprintf(*groupName, "%s_BGr.fbi", name);
for(bb = 0; bb < BASELINEC; bb++) {
(*imageName)[bb] = (char *)calloc(MINILINE, sizeof(char));
if (bb < 9)
sprintf((*imageName)[bb], "%s_BIm_00%d.fbi", name, bb+1);
else if (bb < 99)
sprintf((*imageName)[bb], "%s_BIm_0%d.fbi", name, bb+1);
else
sprintf((*imageName)[bb], "%s_BIm_%d.fbi", name, bb+1);
}
return 0;
}
和
int freeBaseName(char **imageName, char *groupName)
{
int bb;
for(bb = 0; bb < BASELINEC; bb++)
free(imageName[bb]);
free(imageName);
free(groupName);
return 0;
}
在我写的检查这两个函数的程序中,我不小心先后调用了createBaseName
和freeBaseName
,然后我是试图打印出 imageName
和 groupName
。这导致 groupName
打印正常,并且 imageName
的 400 个名称中大约有 120 个在出现段错误之前打印正常。
问题:为什么free
内存无法正常工作?还是释放内存需要时间?
最佳答案
free()
函数仅将内存块标记为“空闲”。这意味着,在任何时候,它都可以被其他函数使用。它不会清理内存,因为它应该由下次将获取此内存块的程序处理。
您实际所做的是未定义的行为。
关于c - C 中 'free' 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16164826/