使用calloc分配的可用二维数组

使用calloc分配的可用二维数组,c,malloc,C,Malloc,我使用的是2D数组,需要按如下所示进行分配: 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(

我使用的是2D数组,需要按如下所示进行分配:

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',所以我不能执行freedata,因此我执行freebuf[0],假设我正在释放1000个元素的整个数组。这样做对吗?freebuf[0]是否释放整个“数据”数组

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


提前谢谢。

这有点不寻常,但它是正确的。您进行了两次分配;你有两次自由。然后释放分配的指针。一切都应该干净


您是否在程序上运行了valgrind?

这有点不寻常,但它是正确的。您进行了两次分配;你有两次自由。然后释放分配的指针。一切都应该干净


您是否在程序上运行了valgrind?

此代码是正确的。buf[0]的值是&data[0],定义为数据。这将释放所有分配的内存

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

offset = 10*sizeof(char*);
buf = calloc(10*100+offset);
在循环中执行以下操作:

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

这个代码是正确的。buf[0]的值是&data[0],定义为数据。这将释放所有分配的内存

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

offset = 10*sizeof(char*);
buf = calloc(10*100+offset);
在循环中执行以下操作:

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

瓦尔格林同意你的看法。这是正确的,因为buf[0]持有指向calloc'd内存块头部的指针

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)

瓦尔格林同意你的看法。这是正确的,因为buf[0]持有指向calloc'd内存块头部的指针

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)

非常感谢。Valgrind验证了它的正确性。我以前没想过Valgrind谢谢。Valgrind验证了它的正确性。以前没有考虑过Valgrind.buf=calloc10*100+偏移量;如果我这样做,buf不是一个二维数组,这不是我想要的。无论如何谢谢。buf=calloc10*100+偏移量;如果我这样做,buf不是一个二维数组,这不是我想要的。无论如何,谢谢你。