2012-02-18 49 views
1

我创建了一个联盟,并将不同类型的数组放入其中。我按顺序打印输出结果,我真的不明白一些观点。联盟的不同类型的阵列的打印输出

1)即使内容不同,为什么我的char数组的长度始终为8?里面只有“你好”。为什么产量是“猫摇滚!”当我尝试第二次打印时。我没有在阵列中放置任何类似的东西。

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 2012-02-18 19:01:57

回答

2

sizeof(uni.array1)始终是8个在64位平台和4个32位的人,因为它是采用指针的大小,不知道你有多少数据相信威力在那个指针后面。类似于数组。你指向一个数组的C指针是“愚蠢的”,不理解数组的大小 - 你需要分别传递这些信息。

这涵盖了您的问题第1部分和第2部分。我们希望在此回答特定问题,因此请随时将您的第三个问题转到单独的帖子。

+1

是的,这里的问题是,他认为指针是一个数组,当它甚至不接近时。 – 2012-02-18 18:58:01

1

你的联合实际上并不包含数组,它只包含两个指针之一。你的机器上指针的大小是8。如果你想在阵列成为联盟的一部分,做这种方式

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

的阵列必须有固定的长度。这是编译时类型的本质。

+0

你是对的我用错了词。 – 2012-02-18 18:58:54