c - 是否可以释放使用 calloc 分配的 char *"

标签 c string free calloc

我想知道是否可以多次释放使用calloc分配的char *(字符串)。

char * signal;  

for (int i = 0 ; i < n ; i++)  {   
   signal = (char*) calloc(n, sizeof(char));
   if (a = true) {
      signal[i] = 1;
   }

   /* do stuff */

   free(signal); /* error here : double free or corruption */   
}

为什么我在 free() 上遇到错误?

最佳答案

would like to know if it's possible to free a char * (string) allocated with calloc but several times.

简短回答:否

长答案:调用 malloc() 一次, calloc() , realloc(NULL, ...) (*1) 允许(要求,不泄漏内存)恰好一次调用 free()将由前者返回的值传递给后者。

因此,如果将已经 free()ed 的地址传递给 free() 并假设在上次调用 后它没有被另一个分配返回free(),然后代码调用未定义的行为,从那时起任何事情都可能发生。

<小时/>

(*1) 关于 realloc() 的注释:

  • 连续调用 realloc() 而不传递 NULL 不会增加对 free() 的必要调用总和。换句话说

    char * p = malloc(42);
    p = realloc(43);
    

    只需要一次调用free()

    free(p);
    
  • NULL 传递给 realloc() 使 realloc() 计数就像调用 malloc().

    正在做

    char * p = realloc(NULL, 42); 
    

    与做的一样

    char * p = malloc(42);
    

关于c - 是否可以释放使用 calloc 分配的 char *",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45376127/

相关文章:

c - 无法正确释放另一个 malloc 的 malloc

c - 在 C 中释放一棵树

c - 在 C89 中,我似乎无法从现有的字符数组中创建字符数组

C:将字符串映射到 ENUM

c - 如果我尝试在 C 中定义一个指向字符串文字的指针,会发生什么情况?

android - 拆分字符串多字符语法

c - Binary64 浮点加法舍入模式错误和行为差异 32/64 位

c - uPP 设备驱动程序正在从缓冲区中删除数据

html - 为什么自动换行在 CSS3 中不能正常工作?

c - 释放C中指针的指针的动态内存