16

構造体へのポインタの配列を初期化することは可能ですか?何かのようなもの:

struct country_t *countries[] = {
        {"United States of America", "America"},
        {"England", "Europe"},
        {"Ethiopia", "Africa"}  
    }

エンティティを非連続メモリに、それらへのポインタを連続メモリに取得するために、これを実行したいと思います...しかし、ダイナミックメモリは使用できないので、それがなくても可能かどうか疑問に思います。

4

2 に答える 2

31

さて、あなたのコードは構造体へのポインタではなく構造体を使用しています。あなたが求めることをする方法があります:以下を含みます:

static struct country_t us = { "United States of America", "America" };
static struct country_t uk = { "England",                  "Europe"  };
static struct country_t et = { "Ethiopia",                 "Africa"  };

struct country_t *countries[] = { &us, &uk, &et, };

C99で指定された初期化子と複合リテラルを使用してこれを行う方法は他にもあります。セクション6.5.2.5「複合リテラル」はその方法を示しています。

struct country_t *countries[] =
{
    &(struct country_t) { "United States of America", "America" },
    &(struct country_t) { "England",                  "Europe"  },
    &(struct country_t) { "Ethiopia",                 "Africa"  },
};

この標準は、関数呼び出しを使用して構造体へのポインターを示しています。すべてのCコンパイラがC99構文を受け入れるわけではなく、これらの複合リテラルはC89(別名C90)には存在しないことに注意してください。

編集: 2文字のISO3166国コードを使用するようにアップグレードされました。また、名前付き構造を静的変数にしました。これらのシンボルは、以前はファイルの外部に表示されていなかったため(存在しなかったため)、現在はファイルの外部にも表示されていません。私は何かをconstにするかどうかを議論し、そうしないことに決めました-しかし、可能であればconstを使用することは一般的に良い考えです。また、この例では、3つの大陸に3つの国があります。1つの大陸(標準)に複数の国がある場合は、大陸の文字列を共有できるようにする必要があります。ただし、それを安全に(またはまったく)実行できるかどうかは、struct country_t(指定されていない)詳細と、プログラムがテーブルの更新を許可されているかどうか(定数の質問に戻ります)によって異なります。

于 2008-10-11T23:39:15.747 に答える
0

これは私のために働きます:


struct country_t {
    char *fullname;
    char *shortname;
};

struct country_t countries[] = {
        {"United States of America", "America"},
        {"England", "Europe"},
        {"Ethiopia", "Africa"}
};

int main(int argc, char *argv[])
{
    return 0;
}

あなたはもっと簡潔で使用することができます:


struct country_t {
    char *fullname;
    char *shortname;
} countries[] = {
        {"United States of America", "America"},
        {"England", "Europe"},
        {"Ethiopia", "Africa"}
};

int main(int argc, char *argv[])
{
    return 0;
}

編集:私はCブックでこの情報を見つけました

于 2008-10-11T23:45:26.077 に答える