0

そのような方法で定義された構造体を持っているので、メモリを割り当てる必要があります

typedef struct string_collection {
    char **c;
    size_t current, allocated;
} TSC, *ASC;

だから私はこのコードを持ってきました、それは正しいですか、それとも何かを見逃しましたか? 最初に構造体記述子を割り当て、次に文字列への d ポインターに十分なスペースを割り当てます

ASC AlocSC(size_t d)
{
    ASC sc;

    sc = (TSC*) malloc(sizeof(TSC));
    if (!sc) return NULL;

    sc->c = calloc(d, sizeof(char *));

    if (!sc->c) {
        free(sc);
        return NULL;
    }

    sc->current = 0;
    sc->allocated = d;

    return sc;
}
4

2 に答える 2

2

編集されたコードは本質的に正しいですが、いくつかのスタイル上の違いがあります (オブジェクトの「ポインター性」を隠すために typedef を実行しない、malloc/calloc 呼び出しで割り当てられたオブジェクトのサイズを使用しない、および他にもいくつかあります)。

あなたのコードは、少し「クリーンアップ」されました:

TSC *AlocSC(size_t d)
{
    TSC *sc = malloc(sizeof *sc);
    if (!sc) return NULL;

    sc->c = calloc(d, sizeof *sc->c);
    if (!sc->c) {
        free(sc);
        return NULL;
    }

    sc->current = 0;
    sc->allocated = d;

    return sc;
}
于 2011-12-08T21:26:38.740 に答える
2

xが に置き換えられている限り、sc私には問題ないように見えます。ただし、C では return をキャストしないでくださいmalloc(詳細はこちらを参照)。代わりに、その行に次のようにします。

sc = malloc(sizeof(*sc));

x->c( ) への型ポイントのサイズについても同じことができますchar*

于 2011-12-08T21:24:24.317 に答える