c - C 中 'free' 的奇怪行为

标签 c memory-management free calloc

我正在编写代码来检查我编写的用于分配和释放内存的两个函数是否有效。这两个功能本质上是

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;
}

在我写的检查这两个函数的程序中,我不小心先后调用了createBaseNamefreeBaseName然后我是试图打印出 imageNamegroupName。这导致 groupName 打印正常,并且 imageName 的 400 个名称中大约有 120 个在出现段错误之前打印正常。

问题:为什么free内存无法正常工作?还是释放内存需要时间?

最佳答案

free() 函数仅将内存块标记为“空闲”。这意味着,在任何时候,它都可以被其他函数使用。它不会清理内存,因为它应该由下次将获取此内存块的程序处理。

您实际所做的是未定义的行为

关于c - C 中 'free' 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16164826/

相关文章:

c - 无论如何要检查 C 中是否存在内存泄漏?

c++ - 内存释放后进程的RES内存会下降吗?

c - 有没有办法在 Linux 中创建用户定义的信号?

c - 查找数组中元素之间的匹配项? (C)

java - 静态变量引用对象的垃圾回收

c# - File.ReadAllText OutOfMemoryException 异常

C:释放每个 malloc 还是只释放主要的?

c++ - 从字符串中读取/解析多个 INT

C++ 分配对象数组

c - 从文本文件中读取未知长度的字符串并打印它们