2012-02-18 9 views
1

私はユニオンを作成しましたが、その中に異なるタイプの配列を配置しました。私はオーダーで出力を印刷しましたが、実際にはいくつかの点を理解していませんでした。異なるタイプのユニオン配列の出力を出力

1)コンテンツが異なっても、なぜ文字配列の長さが常に8ですか?その中には "こんにちは"だけがあります。そしてなぜその出力は "Cats rock!"なのでしょうか?私が2回目の印刷をしようとするとき。私は配列のようなものを入れなかった。

2)もう一度長さの問題。すべての配列の長さは、組合の長さでさえも8です。どうして?

3)私の最後の質問は、二度目に印刷しようとすると倍数の値が変更された理由です。

私はあなたに私のコードを掲示しています。長いポストについては申し訳ありませんが、私は本当に混乱しています。

char: hello, 8 
double: 5.557111111111111, 8 
int: 1937006915 1668248096 8555, 8 

char: Cats rock! 
double: 0.000000000000000 
int: 1937006915 1668248096 8555 
size of union: 8 

私のコード

#define NUM1 5.557111111111111 

#define NUM2 1937006915 
#define NUM3 1668248096 
#define NUM4 8555 
#include <stdio.h> 

/*created an union*/ 
typedef union { 
    char * array1; 
    double num; 
    int * array2; 
} myunion; 

int main(int argc, char ** argv) 
{ 
    /* declaring union variable */ 
    myunion uni; 
    /* creating my string */ 
    char strarray[] = "hello"; 

    /* declare an int array*/ 
    int numarray[] = { NUM2, NUM3, NUM4 }; 

    /* assign the string to the char pointer in the union */ 
    uni.array1 = strarray; 

    /* print the union and the sizeof of the pointer */ 
    printf("char: %s, %zu\n", uni.array1,sizeof(uni.array1)); 

    /* assign NUM1 to the double part of union */ 
    uni.num = NUM1; 

    /* print the double and its sizeof */ 
    printf("double: %10.15f, %zu\n", uni.num, sizeof(uni.num)); 

    /* assign array2 of union to the numarray */ 
    uni.array2 = numarray; 

    /* print the values and the sizeof */ 
    printf("int: %d %d %d, %zu\n", uni.array2[0], uni.array2[1], uni.array2[2], sizeof(uni.array2)); 

    /* print the char array, double and int array */ 
    printf("\nchar: %s \ndouble: %10.15f \nint: %d %d %d\n",uni.array1, uni.num, uni.array2[0], uni.array2[1], uni.array2[2]); 

    /* print the size of the union */ 
    printf("size of union: %zu\n", sizeof(uni)); 

    return 0; 
} 
+0

あなたは組合が実際に何をしているか考えていますか? – Dan

答えて

2

sizeof(uni.array1)それはあなたがかもしれないと考えているどのくらいのデータを知らない、ポインタのサイズを取っているので、32ビットのもので、常に64ビットプラットフォーム上の8と4ですそのポインタの後ろにいる。配列と同様です。あなたが配列を指すCポインタは "ダム"であり、配列の大きさを理解していません。その情報を別々に渡す必要があります。

これは質問のパート1と2をカバーしています。ここでは具体的な質問にお答えしますので、3番目の質問を別の投稿に自由に移動してください。

+1

ええ、ここでの問題は、ポインタが配列でもないと思うということです。 –

1

あなたのユニオンは実際には配列を含んでおらず、2つのポインタのうちの1つだけを含んでいます。あなたのマシン上のポインタのサイズは、アレイは、労働組合の一部になりたい場合は、配列は固定長を持っている必要があり、それをこのよう

typedef union { 
    char array1[MAX*8]; /* or whatever */ 
    double num; 
    int array2[MAX]; 
} myunion; 

をください8です。それはコンパイル時の種類の性質です。

+0

あなたは正しく私が間違った言葉を使いました。 –

関連する問題