C 打印联合的不同类型数组的输出

C 打印联合的不同类型数组的输出,c,linux,unions,C,Linux,Unions,我创建了一个并集,并在其中放置了不同类型的数组。我按顺序打印了输出,但我确实不明白其中的一些要点 1) 为什么我的字符数组的长度总是8,即使内容不同?里面只有“你好”。当我第二次尝试打印时,为什么输出是“猫摇滚!”。我没有在数组中放入类似的内容 2) 又是长度问题。我所有数组的长度都是8,甚至是并集的长度。为什么? 3) 我的最后一个问题是,当我第二次尝试打印时,为什么double number的值会发生变化 我给你发我的密码,把我得到的发出去。很抱歉发了这么长的帖子,但我真的很困惑 char:

我创建了一个并集,并在其中放置了不同类型的数组。我按顺序打印了输出,但我确实不明白其中的一些要点

1) 为什么我的字符数组的长度总是8,即使内容不同?里面只有“你好”。当我第二次尝试打印时,为什么输出是“猫摇滚!”。我没有在数组中放入类似的内容

2) 又是长度问题。我所有数组的长度都是8,甚至是并集的长度。为什么?

3) 我的最后一个问题是,当我第二次尝试打印时,为什么double number的值会发生变化

我给你发我的密码,把我得到的发出去。很抱歉发了这么长的帖子,但我真的很困惑

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;
}
#定义NUM1 5.557111111
#定义NUM2 1937006915
#定义NUM3 1668248096
#定义NUM4 8555
#包括
/*创建了一个联盟*/
typedef联合{
字符*数组1;
双数;
int*array2;
}我的联盟;
int main(int argc,字符**argv)
{
/*声明联合变量*/
美联大学;
/*创建我的字符串*/
char strarray[]=“你好”;
/*声明一个int数组*/
int numarray[]={NUM2,NUM3,NUM4};
/*将字符串指定给联合体中的字符指针*/
uni.array1=strarray;
/*打印指针的并集和大小*/
printf(“字符:%s,%zu\n”,uni.array1,sizeof(uni.array1));
/*将NUM1指定给并集的双部分*/
uni.num=NUM1;
/*打印double及其大小*/
printf(“双精度:%10.15f,%zu\n”,uni.num,sizeof(uni.num));
/*将联盟的数组2分配给Numaray*/
uni.array2=努马拉伊;
/*打印值和大小*/
printf(“int:%d%d%d,%zu\n”,uni.array2[0],uni.array2[1],uni.array2[2],sizeof(uni.array2));
/*打印字符数组、双精度数组和整数数组*/
printf(“\nchar:%s\n倍数:%10.15f\n:%d%d%d\n”,uni.array1,uni.num,uni.array2[0],uni.array2[1],uni.array2[2]);
/*打印联合体的大小*/
printf(“联合的大小:%zu\n”,sizeof(uni));
返回0;
}
sizeof(uni.array1)
在64位平台上始终为8,在32位平台上始终为4,因为它采用指针的大小,不知道您认为该指针后面可能有多少数据。阵列的情况类似。指向数组的C指针是“哑”的,不知道数组有多大——需要单独传递这些信息


这包括你的问题的第1部分和第2部分。我们想在这里回答具体的问题,所以请随意将您的第三个问题转移到另一个帖子。

您的工会实际上并不包含数组,它只包含(其中一个)两个指针。您机器上的指针大小为8。如果希望数组成为联合体的一部分,请这样做

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

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

是的,这里的问题是,他认为指针是数组,而它甚至不接近。你知道联合实际上是什么吗?