4

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;
}

na,ne,nc に関連する 3 つの警告が表示されます。私は何をスキップしていますか?ありがとう!

LE: みんなありがとう、私のプロジェクトは今動きます! ハッピーホリデー!

4

4 に答える 4

4

変数を動的に割り当てていない場合:

size_t nc, na, ne;

それらを解放する理由はありません。

静的に割り当てられた変数を呼び出すのではなくfree、以前に割り当てられた領域を指すポインターに格納されているアドレスのみを呼び出します。

これを行う場合:

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

na変数とを割り当てていませんnc。以前に割り当てられた構造体に属し、に格納されているアドレスが指すこれらの変数に値を割り当てるだけですaf

于 2012-12-23T17:49:41.593 に答える
4

na,ne,nc に関連する 3 つの警告が表示されます。私は何をスキップしていますか?

malloc動的に割り当てられたメモリ領域へのポインタを返します。size_t変数はそのようなアドレスを保持できません。

(*af)->c割り当てたもの、つまりandを解放するだけです af

于 2012-12-23T17:51:38.047 に答える
3

、などfreeの呼び出しによって割り当てられたオブジェクトのみを呼び出す必要があります。これらの 3 つのフィールドはそのように作成されていないため、それらを試行しないでください。mallocrealloccallocfree

これら 3 つのフィールドのメモリは、構造体を割り当てるときに割り当てられる構造体の一部です。個別に割り当てられたわけではありません。したがって、個別の割り当て解除は必要ありません。

于 2012-12-23T17:52:10.857 に答える
2

size_t はローカル変数です。つまり、動的に割り当てられません (つまり、構造体に割り当てられたメモリの一部であり、メモリを手動で管理する必要はありません)。構造体を解放すると、ローカル変数は自動的にクリーンアップされます。

于 2012-12-23T18:00:17.723 に答える