打印不同类型的联合阵列的输出

时间:2012-02-18 18:48:28

标签: c linux unions

我创建了一个union,我在其中放入了不同类型的数组。我按顺序打印输出,我真的不明白一些要点。

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;
}

2 个答案:

答案 0 :(得分:2)

sizeof(uni.array1)在64位平台上始终为8,在32位平台上为4,因为它占用指针的大小,而不知道您认为该指针背后可能有多少数据。类似于数组。您指向数组的C指针是“哑”,并且不了解数组的大小 - 您需要单独传递该信息。

这涵盖了您的问题第1部分和第2部分。我们希望在此处回答具体问题,因此请随意将您的第三个问题转到另一个帖子。

答案 1 :(得分:1)

你的联盟实际上并不包含数组,它只包含(一个)两个指针。你机器上指针的大小是8.如果你想让数组成为联合的一部分,那就这样做吧

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

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