我可以通过使数组等于声明但未初始化的任何整数变量来改变数组的任何元素吗?

时间:2013-07-29 17:02:08

标签: c arrays

代码:

         #include<stdio.h>
         #include<conio.h>
         int main()
         {
                 int a, b, c, d,t;
                 int arr[8]={8,6,5,6,7,8,7,8};
                 int arr_foo[8]={6,7,8,4,8,4,2,7};
                 printf("the first array is\n");
                 for(a=0; a<8; a++)
                 {
                            printf("%d %s", arr[a], ",");
                 }
                 printf("\n");
                 printf("the second array is\n");
                 for(a=0; a<8; a++)
                 {
                            printf("%d %s", arr_foo[a], ",");
                 }
                 printf("\n");
                 for(a=0; a<8; a++)
                 {
                          for(b=a+1; b<8; b++)
                          {
                                     if(arr[a]==arr[b])
                                     {
                                             arr[b]=t;
                                     }
                          }
                          if(arr[a] != t)
                          {
                                 c=0;
                                 for(d=0; d<8; d++)
                                 {
                                       if(arr[a]==arr_foo[d])
                                       {
                                             c++;
                                       }
                                 }
                                 printf("%d %s %d %s\n", arr[a], "found", c, "times");
                   }//end if
           }//end for
           getch();
           return 0;
        }//end main

代码包含两个数组并搜索第一个数组的元素是否存在于第二个数组中。如果是,那么多少次?
             我想知道将arr[b]=t放在t是任何整数变量

的位置是合理的

2 个答案:

答案 0 :(得分:2)

简短回答:是的。但是你会得到一个垃圾值。

答案很长(Eric Postpischil的答案要好得多):

  

C标准未定义该行为。 Per C 2011(N1570)   6.3.2.1 2:“如果左值指定了一个可以用寄存器存储类声明的自动存储持续时间的对象   (从未使用过地址),并且该对象未初始化(不是   用初始化程序声明并且没有赋值给它   在使用之前执行),行为未定义。“

答案 1 :(得分:0)

通常,如果使用未初始化的对象,则行为不是由C 2011标准定义的:

  

如果左值指定了一个可以使用寄存器存储类声明的自动存储持续时间的对象(从未使用过其地址),并且该对象未初始化(未使用初始化程序声明,并且未对其进行任何赋值)在使用之前),行为未定义。

在C 1999中,行为被部分定义。使用未初始化的值只会给您一个不确定的值。只要该值不是陷阱表示,代码就会执行,就像某个对象已初始化为某个未指定的值一样。

大多数实现都将提供C 1999行为,并且不会为int提供陷阱表示。但是,如果您使用未初始化的值(这是语言被添加到C 2011标准的原因),至少有一个实现可能会陷阱。因此,如果您只想依赖C 2011标准,则不得使用自动存储持续时间的未初始化对象(除非您使用其地址)。