关于打印阵列

时间:2014-08-06 14:37:21

标签: c arrays unions

我是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?

4 个答案:

答案 0 :(得分:3)

您一次只能初始化union的一个成员。 c(第一个成员)的元素在此处初始化 1 ab的成员未初始化。访问未初始化的变量会调用未定义的行为。您可能会得到预期或意外的结果。

n1570:附件J:J.2未定义的行为

  

在以下情况下,行为未定义:
  ...
   - 左值指定可能已经存在的自动存储持续时间的对象   使用寄存器存储类声明的是在需要该值的上下文中使用   指定对象的但该对象未初始化(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)

两个大问题:

  1. 可以分配给char的最大正值(很可能)为128或256,具体取决于它是有符号还是无符号。

  2. 您没有正确地为point.a分配值。必须按如下方式完成:

    point = {.a[0][1] = 256, .a[1][2] = 258, .a[2][0] = 260};
    
  3. 以下按预期方式工作:

    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]);