使用calloc分配的可用二维数组
我使用的是2D数组,需要按如下所示进行分配:使用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(
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不是一个二维数组,这不是我想要的。无论如何,谢谢你。