【问题标题】:free 2D array allocated using calloc使用 calloc 分配的免费二维数组
【发布时间】:2011-10-01 17:03:27
【问题描述】:

我使用的是二维数组,需要按如下方式分配:

char ** buf; //global var

void allocate()
{
    buf = (char **) malloc (10 * sizeof (char*));
    char * data = (char *) calloc (1, 1000);
    int i;
    for(i=0; i<10; i++)
        buf[i] = &(data[i*100]);
}

int main()
{
    allocate();

    //something goes here

    free(buf[0]);
    free(buf);
    return 0;
}

现在释放数组,因为我无法访问 main() 中的变量 'data',所以我无法进行 free(data),因此我做了 free(buf[0]),假设我正在释放 1000 个元素的整个数组。这是正确的方法吗? free(buf[0]) 是否释放整个“数据”数组?

(将 buf 的每个元素 malloc 为 buf[i] = malloc (100) 会很方便,但我不能这样做,因为我必须先调用一个大块)。

提前致谢。

【问题讨论】:

    标签: c malloc


    【解决方案1】:

    这段代码是正确的。 buf[0] 的值是 &amp;(data[0]),根据定义是 data。这将释放所有分配的内存。

    请注意,如果您真的只想释放一个缓冲区,您可以设置:

    offset = 10*sizeof(char*);
    buf = calloc(10*100+offset);
    

    在循环中做:

    buf[i] = buf + offset + i*100;
    

    【讨论】:

    • buf = calloc(10*100+offset);如果我这样做, buf 不是二维数组,这不是我想要的。还是谢谢。
    【解决方案2】:

    这有点不寻常,但它是正确的。你做了两次分配;你做了两个免费的。然后释放已分配的指针。一切都应该是干净的。

    您是否在程序中运行了valgrind

    【讨论】:

    • 谢谢。 Valgrind 验证它是正确的。之前没想过 Valgrind。
    【解决方案3】:

    Valgrind 同意你的观点。这是正确的,因为 buf[0] 持有指向 calloc'd 内存块的 HEAD 的指针。

    valgrind ./temp
    ==15404== Memcheck, a memory error detector
    ==15404== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
    ==15404== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
    ==15404== Command: ./temp
    ==15404== 
    ==15404== 
    ==15404== HEAP SUMMARY:
    ==15404==     in use at exit: 0 bytes in 0 blocks
    ==15404==   total heap usage: 2 allocs, 2 frees, 1,040 bytes allocated
    ==15404== 
    ==15404== All heap blocks were freed -- no leaks are possible
    ==15404== 
    ==15404== For counts of detected and suppressed errors, rerun with: -v
    ==15404== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 12 from 7)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      • 2014-01-05
      • 2012-05-07
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      相关资源
      最近更新 更多