在数组是参数的函数内部调用 realloc 的问题
Problem with calling realloc inside function where an array is a parameter
我对 realloc 有疑问。 Valgrind returns 8 bytes in 1 blocks are definitely lost in loss record 1 of 1
。而如果我从 main 调用函数 allocate
,它就可以工作。我不明白有什么区别?如果我将 free(tab)
放在函数 sth
中,它会起作用,但我需要在 main 中使用 tab
做一些事情。谁能帮忙找到解决办法?
#include <stdio.h>
#include <stdlib.h>
struct x{
int a;
char b;
};
void allocate( struct x **tab,int *size)
{
*size = 1+2*(*size);
*tab= realloc(*tab, (size_t) (*size) * sizeof (**tab));
}
void sth (struct x *tab, int *size)
{
//do something here
allocate(&tab, size);
}
int main(void)
{
int size=0;
struct x *tab=NULL;
sth(tab, &size);
//do sth here with tab
free(tab);
return 0;
}
函数 sth
的参数 tab
是 所传递内容的 副本,对其进行更改不会影响所传递内容。因此,main()
函数中的free(tab);
表示free(NULL);
。这被定义为什么都不做,也不会有助于避免内存泄漏。传递指向应该修改的内容的指针,以使函数修改传递的内容。
#include <stdio.h>
#include <stdlib.h>
struct x{
int a;
char b;
};
void allocate( struct x **tab,int *size)
{
*size = 1+2*(*size);
*tab= realloc(*tab, (size_t) (*size) * sizeof (**tab));
}
void sth (struct x **tab, int *size) // receive a pointer of struct x*
{
//do something here
// allocate(&(*tab), size);
allocate(tab, size);
}
int main(void)
{
int size=0;
struct x *tab=NULL;
sth(&tab, &size); // pass a pointer to what should be modified
//do sth here with tab
free(tab);
return 0;
}
我对 realloc 有疑问。 Valgrind returns 8 bytes in 1 blocks are definitely lost in loss record 1 of 1
。而如果我从 main 调用函数 allocate
,它就可以工作。我不明白有什么区别?如果我将 free(tab)
放在函数 sth
中,它会起作用,但我需要在 main 中使用 tab
做一些事情。谁能帮忙找到解决办法?
#include <stdio.h>
#include <stdlib.h>
struct x{
int a;
char b;
};
void allocate( struct x **tab,int *size)
{
*size = 1+2*(*size);
*tab= realloc(*tab, (size_t) (*size) * sizeof (**tab));
}
void sth (struct x *tab, int *size)
{
//do something here
allocate(&tab, size);
}
int main(void)
{
int size=0;
struct x *tab=NULL;
sth(tab, &size);
//do sth here with tab
free(tab);
return 0;
}
函数 sth
的参数 tab
是 所传递内容的 副本,对其进行更改不会影响所传递内容。因此,main()
函数中的free(tab);
表示free(NULL);
。这被定义为什么都不做,也不会有助于避免内存泄漏。传递指向应该修改的内容的指针,以使函数修改传递的内容。
#include <stdio.h>
#include <stdlib.h>
struct x{
int a;
char b;
};
void allocate( struct x **tab,int *size)
{
*size = 1+2*(*size);
*tab= realloc(*tab, (size_t) (*size) * sizeof (**tab));
}
void sth (struct x **tab, int *size) // receive a pointer of struct x*
{
//do something here
// allocate(&(*tab), size);
allocate(tab, size);
}
int main(void)
{
int size=0;
struct x *tab=NULL;
sth(&tab, &size); // pass a pointer to what should be modified
//do sth here with tab
free(tab);
return 0;
}