2010-11-20 7 views
0

のgcc 4.5.1 C89次のフラグでコンパイルした構造

初期化:-Wall, -Wextra

をI Iは、デフォルト値で初期化しようとしている次のような構造を持っています。

static struct Device { 
    char *name; 
    char *config; 
} *app = { NULL, NULL }; 

警告:しかし、私は次の警告を得る私は非ポインタを宣言することにより、次の操作を行う場合、私は何の問題は、IE得ることはありません、しかし

warning: initialization from incompatible pointer type 
warning: excess elements in scalar initializer 

static struct Device { 
     char *name; 
     char *config; 
    } app = { NULL, NULL }; 

なぜですか?あなたがそのようにポインタを初期化することはできません何かアドバイスのため

多くのおかげで、

答えて

2

。あなたはこれを行うことができます:

static struct Device { 
    char *name; 
    char *config; 
} *app = NULL; 

NULLへのポインタを初期化します。ポインタはメモリアドレス以外のものです。あなたはメモリアドレスに{ NULL, NULL }をお尻にすることはできません。

2

ポインタは構造体ではなく、その値がアドレスである単純型です。あなたのapp変数がポインタ型の場合

  • 、それはNULLで初期化することができるが、中括弧がapp変数の型struct Deviceである場合は、
  • 使用する構文はないと、あなたが提供するブレース初期化子を使用することができますnameconfigフィールド
2

に初期NULL値*アプリはそう{NULL、NULL}にそれを初期化することは間違っているポインタであるので、あなたは、単にNULLに初期化する必要があります。

の場合、structの実際の変数インスタンスがあるので、構造体のメンバーをNULLに初期化します。これはOKです。

関連する問題