我试图将一个指向指针(char **)的指针传递给一个初始化它的函数,然后将它传递给另一个释放内存的函数,但是我在释放时遇到了seg错误这让我相信我的分配是错误的。
Valgrind正在报告在这条线上使用未经注册的价值。 tmp [i]指向0x0。
if(tmp[i]) free((char*)tmp[i]);
这是代码(这只是测试代码)
void
alloc_strings(char ***test, int count)
{
char **tmp = *test;
tmp = malloc(count * sizeof(char*));
int i;
for(i = 0; i < count; i++) {
tmp[i] = malloc(6);
strcpy(tmp[i],"Hello");
}
}
void
free_strings(char ***test, int count)
{
char **tmp = *test;
int i;
for(i = 0; i < count; i++) {
if(tmp[i]) free((char*)tmp[i]);
}
if(tmp)
free(tmp);
}
并且调用:
int
main(int argc, char **argv)
{
char **test;
alloc_strings(&test, 10);
free_strings(&test, 10);
return 0;
}
我已经玩了一段时间,阅读指针等,但无法解决这个问题。任何想法非常感谢!
答案 0 :(得分:1)
您需要分配到*test
,而不是从中分配。怎么样:
void
alloc_strings(char ***test, int count)
{
char **tmp = malloc(count * sizeof *tmp);
/*...*/
*test = tmp;
}
答案 1 :(得分:0)
在代码示例中,
alloc_strings(char ***test, int count)
{
char **tmp = *test;
*test
应该有一些空间来存储指向当前未分配的char **
的指针。因此,如果示例是这样的
char** array[1];
alloc_strings(&array[0], 7);
我觉得代码可行。