2016-10-02 11 views
0

unionを使用すると、確かに異なるデータ型の要素を含む配列を持つことができます。非同種配列のメモリ割り当てはどのように機能しますか?

struct elements { 
    int s; 
    union { 
     int ival; 
     float fval; 
     char *pval; 
    } element; 
}; 
struct darray { 
    struct elements items[100]; 
}; 

今、私たちは、異なるデータ型の要素を含むことができる配列を宣言することができます。組合の唯一の単一のメンバーは、単一の時点で存在することができますが、:私を悩まれ

struct darray a; 

何我々はすでに100要素を含む配列を持っています。これらの要素は初期化されていませんが、ここでメモリを割り当てるべきではありませんか?

どのようにメモリ割り当てがそのような配列で機能しますか?

+1

「あなたは確かに異なるタイプの要素を含む配列を持つことができます。それは間違っている。同種の配列の配列しか持てません。同種の型の配列のみを表示します。型は 'struct elements'です。これは3つの異なる型の' int'と 'union'を含む型ですが、' struct elements'は常に同じサイズです。 –

答えて

0

のは、次のコードに見てみましょう:

#include <stdio.h> 
#include <stdlib.h> 

typedef union __attribute__((__packed__)) { 
    int ival; 
    int fval; 
    char* pval; 
} element; 

typedef struct __attribute__((__packed__)) { 
    int  s; 
    element e; 
} elements; 

typedef struct __attribute__((__packed__)) { 
    elements items[100]; 
} darray; 

int main() 
{ 
    darray d = {0}; 
    printf("size of element: %lu.\n", sizeof(element)); 
    printf("size of elements: %lu.\n", sizeof(elements)); 
    printf("size of darray: %lu.\n", sizeof(darray)); 
    return 0; 
} 
// The output is: 
// size of element: 8 
// size of elements: 12 
// size of elements: 1200 

今みましょうさんは、ちょうど何が起こったのかを説明します。

  1. を、私は64ビットマシンを使用しているポインタがサイズのものであるので、8
  2. を私たちは、メモリの余分なバイトで私たちの構造体をパディングないコンパイラを強制するために__attribute__((__packed__))を使用しました。それは彼に言っているように、以下のメンバーを含む構造体を構築するのに必要な最小限のメモリを使います。
  3. elementは現在運んでいるものは分かりませんが、コンパイル時にはすでにサイズがであることに注意してください。要素のサイズは8です、なぜですか?ユニオンサイズは、より大きいメンバー(ここではint、4はfloat、4はchar*、これは8 [64ビットマシン]です)によって固定されています。
  4. ユニオンのサイズが固定されており、100メンバの配列を作成していることがわかったので、メモリは100 * sizeof(elements) = 100 * (sizeof(int) + sizeof(element)) = 100 * (4 + 8) = 1200バイト必要です。
1

配列は同質ですが、同じ基本メモリを使用して異なる型を表すユニオンが含まれています。

各要素は、独自のメンバーsおよび要素を持つ独自のオブジェクトです。

あなたが別の要素に異なるタイプを割り当てることは自由です。

enum 
{ 
    INT , 
    FLOAT , 
    STRING , 
} ; 

struct darray a; 
a.items[0].s = INT; 
a.items[0].element.ival = 12345; 
a.items[1].s = FLOAT; 
a.items[1].element.fval = 4.56F; 
a.items[2].s = STRING; 
a.items[2].element.pval = "string literal"; 

printf("%d %f %s\n" , a.items[0].element.ival , 
         a.items[1].element.fval , 
         a.items[2].element.pval); 

代わりにタイプstruct darrayにタイプstruct要素をラップで、あなたはまた、単にタイプstruct要素の配列を定義することができます。

struct elements a[100]; 
+0

あなたが示したように、私は異なる要素に異なるタイプを割り当てることができますが、 'Memory Allocation'はどのように機能しますか? – user311413

関連する問題