如何从struct中释放size_t

时间:2012-12-23 17:43:28

标签: c struct free size-t

我试图释放一个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:谢谢大家,我的项目现在有效!节日快乐!

4 个答案:

答案 0 :(得分:4)

如果您尚未动态分配变量:

size_t nc, na, ne;

没有理由解放他们。

您不会在静态分配的变量上调用free,仅在存储在指针中的地址上调用,这些地址指向以前分配的区域。

执行此操作时:

(*af)->na=e; 
(*af)->nc=d; 

您没有分配变量nanc;您只需将值分配给属于以前分配的结构的变量,并由af中存储的地址指向。

答案 1 :(得分:4)

  

我收到3个警告,都与na,ne,nc有关。我跳过什么?

malloc返回指向动态分配的内存区域的指针。 size_t变量无法保存此类地址。

您只需要释放您分配的内容,即(*af)->caf

答案 2 :(得分:3)

您应该只对通过调用freemallocrealloc等分配的对象调用calloc。因为这三个字段不是以这种方式创建的不应该尝试free他们。

这三个字段的内存是分配结构时分配的结构的一部分。它没有单独分配。因此不需要单独释放。

答案 3 :(得分:2)

size_t是局部变量,这意味着它们不是动态分配的(即它们是为结构分配的内存的一部分,您不必手动管理它们的内存)。释放结构后,将自动清除局部变量。