我是C.的新人 假设我有一个工会。
union DP
{
int c[3];
char a[3][4];
short b[2];
}point = {256,258,260};
printf("%i",point.a[0][1]);
printf("%i",point.a[1][2]);
printf("%i",point.a[2][0]);
为什么第一次打印给1和第二次给0,第三次给4?
答案 0 :(得分:3)
您一次只能初始化union
的一个成员。 c
(第一个成员)的元素在此处初始化 1 。 a
和b
的成员未初始化。访问未初始化的变量会调用未定义的行为。您可能会得到预期或意外的结果。
在以下情况下,行为未定义:
...
- 左值指定可能已经存在的自动存储持续时间的对象 使用寄存器存储类声明的是在需要该值的上下文中使用 指定对象的但该对象未初始化(6.3.2.1)。
1 :可以使用C99 designated initializers
初始化其他成员答案 1 :(得分:3)
考虑到你已经建立了一个联合(非常奇怪的btw),因为你将变量point
初始化为3 int
s的数组(你的第一个字段),所以给出原因是非常简单的。联盟):
a[0][1]
是1 st 号的2 nd 字节,256。在十六进制表示法中,此int
为0x00000100,因此2 nd 字节是0x01 - >价值是1。a[1][2]
是2 nd 数字的3 rd 字节,258。在十六进制表示法中,此int
为0x00000102,因此3 rd 字节是0x00 - >值为0. a[2][0]
是3 rd 号的1 st 字节,260。在十六进制表示法中,此int
为0x00000104,因此3 rd 字节是0x04 - >价值是4。答案 2 :(得分:0)
两个大问题:
可以分配给char
的最大正值(很可能)为128或256,具体取决于它是有符号还是无符号。
您没有正确地为point.a
分配值。必须按如下方式完成:
point = {.a[0][1] = 256, .a[1][2] = 258, .a[2][0] = 260};
以下按预期方式工作:
union DP
{
int c[3];
char a[3][4];
short b[2];
} point = {.a[0][1] = 'a', .a[1][2] = 'b', .a[2][0] = 'c'};
printf("%c",point.a[0][1]);
printf("%c",point.a[1][2]);
printf("%c",point.a[2][0]);
ABC
修改强>
如果您打算将值分配给point.c
,那么您可以执行与上述内容非常相似的操作:
point = {.c[0] = 256, .c[1] = 258, .c[2] = 260};
...或
point = {.c[0] = 256, 258, 260};
答案 3 :(得分:0)
如果要初始化Matrixes和Vectors,则必须逐个初始化它们,并用零填充不可用的空格,否则不应初始化。我重构了你的代码,尝试一下,看看会发生什么,我不确定你的代码的目标是什么。
union DP
{
int c[3];
char a[3][4] = {256,258,260,0,0,0,0,0,0,0,0,0,0}; //This will generate an overflow, char characters max value is 255 each (1 byte)
short b[2];
}point;
printf("%i",point.a[0][1]); //This printf will show this value as Integer type, if this compiles
printf("%i",point.a[1][2]);
printf("%i",point.a[2][0]);