繁体   English   中英

使用 calloc 分配的免费二维数组

[英]free 2D array allocated using calloc

我正在使用二维数组,并且需要分配它,如下所示:

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

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

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

提前致谢。

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

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

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

并在循环中执行:

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

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

你在你的程序上运行了valgrind吗?

Valgrind 同意你的观点。 这是正确的,因为 buf[0] 持有指向 calloc'd memory 块的 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM