我试图释放一个struct的元素,它有size_t变量和char。如何释放size_t,因为我不断收到像
这样的警告[Warning] passing arg 1 of `free' makes pointer from integer without a cast
现在我知道我需要演员,但我不知道怎么做!这是代码:
typedef struct collection
{
char **c;
size_t nc, na, ne;
} TCS, * ACS;
void Destroy(ACS *x)
{
int i;
free((*x)->na);
for(i=0;i<(*x)->nc;i++)
free((*x)->c[i]);
free((*x)->c);
free((*x)->nc);
free((*x)->ne);
}
/* allocating */
ACS AlocCS(size_t d, size_t e)
{
ACS *af=(ACS*)malloc(d);
if(af==NULL)
return 0;
(*af)->na=e;
(*af)->nc=d;
(*af)->c=(char**)calloc(e*d,sizeof(char));
if((*af)->c==NULL){
free(af);
return 0;}
return *af;
}
我收到3个警告,都与na,ne,nc有关。我跳的是什么?谢谢!
LE:谢谢大家,我的项目现在有效!节日快乐!
答案 0 :(得分:4)
如果您尚未动态分配变量:
size_t nc, na, ne;
没有理由解放他们。
您不会在静态分配的变量上调用free
,仅在存储在指针中的地址上调用,这些地址指向以前分配的区域。
执行此操作时:
(*af)->na=e;
(*af)->nc=d;
您没有分配变量na
和nc
;您只需将值分配给属于以前分配的结构的变量,并由af
中存储的地址指向。
答案 1 :(得分:4)
我收到3个警告,都与na,ne,nc有关。我跳过什么?
malloc
返回指向动态分配的内存区域的指针。 size_t
变量无法保存此类地址。
您只需要释放您分配的内容,即(*af)->c
和af
。
答案 2 :(得分:3)
您应该只对通过调用free
,malloc
,realloc
等分配的对象调用calloc
。因为这三个字段不是以这种方式创建的不应该尝试free
他们。
这三个字段的内存是分配结构时分配的结构的一部分。它没有单独分配。因此不需要单独释放。
答案 3 :(得分:2)
size_t是局部变量,这意味着它们不是动态分配的(即它们是为结构分配的内存的一部分,您不必手动管理它们的内存)。释放结构后,将自动清除局部变量。