4

我正在尝试释放具有 size_t 变量和字符的结构的元素。如何释放 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

4 回答 4

4

如果您没有动态分配变量:

size_t nc, na, ne;

没有理由释放他们。

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

当你这样做时:

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

您没有分配变量nanc; 您只是将值分配给这些变量,这些变量属于以前分配的结构,并由存储在af.

于 2012-12-23T17:49:41.593 回答
4

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

malloc返回指向动态分配的内存区域的指针。size_t变量不能保存这样的地址。

你只需要释放你分配的东西,即 (*af)->caf.

于 2012-12-23T17:51:38.047 回答
3

您应该只调用通过调用,等free分配的对象。由于这三个字段不是以这种方式创建的,因此您不应尝试使用它们。mallocrealloccallocfree

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

于 2012-12-23T17:52:10.857 回答
2

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

于 2012-12-23T18:00:17.723 回答