web-dev-qa-db-ja.com

ユニオンを初期化するには?

structの場合は、実行できます

*p = {var1, var2..};

しかし、これはunionでは機能しないようです:

union Ptrlist
{
        Ptrlist *next;
            State *s;
};

Ptrlist *l;
l = allocate_space();
*l = {NULL};

取得するだけ:

expected expression before ‘{’ token
16
lexer

C99では、d で指定された共用体初期化子 を使用できます。

union {
      char birthday[9];
      int age;
      float weight;
      } people = { .age = 14 };

C++では、 共用体にコンストラクター を含めることができます。

C89では、明示的に行う必要があります。

typedef union {
  int x;
  float y;
  void *z;
} thing_t;

thing_t foo;
foo.x = 2;

ちなみに、Cの共用体では、 すべてのメンバーが同じメモリ空間を共有していることをご存知ですか

int main () 
{
   thing_t foo;
   printf("x: %p  y: %p  z: %p\n",
     &foo.x, &foo.y, &foo.z );
   return 0;
}

出力

x:0xbfbefebc y:0xbfbefebc z:0xbfbefebc

28
Crashworks

初期化と割り当てには違いがあります。初期化はインテリジェントですが、割り当てでは適切なアドレスを解決する必要があります。

 
例
 char str [] = "xyz"; //機能する-初期化
 char str [10]; 
 str = "xyz"; //エラー-割り当て
 // strは文字列ではなく文字を保持できるアドレス
 
同様に
 Ptrlist l = {NULL}; //機能-初期化
 Ptrlist * l; 
 l-> next = NULL; //割り当てを機能させる
 l = {NULL}; //割り当てです。アドレススペースエラーがわかりません
 
2
Kamath
union Ptrlist1
{
    char *next;
    char  *s;
};

union Ptrlist1 l = {  NULL };

ユニオンの初期化の例をご覧ください。あなたの場合、私はいくつかの間違いがあると思います

  Ptrlist how can be member of union..??

あなたは書くべきです

 union Ptrlist
 {
    union Ptrlist *next;
        State *s;
 };
0
Jeegar Patel

フィールドの1つをNULLに割り当てます。ユニオンなので、すべてのフィールドはNULLになります。

0
duedl0r

Stateクラスがないので、intに置き換えました。

これは私のコードです:

union Ptrlist
{
    Ptrlist *next;
    int *n;
};


int main(int argc, char** argv)
{
    Ptrlist *l = new Ptrlist;

    // I'm using a way c++ allocated memory here, you can change it to malloc.
    l->n = new int;
    *(l->n) = 10;

    // Because you used an union, n's and next's addres is same 
    // and this will output 10
    printf("%d", *(l->next));

    getch();
    return 0;
}

このようにして、nの値は10に初期化されます

0
shengy