C语言 为什么输出总是六个变量,即使输入是7个或更多?[副本]

6ie5vjzr  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(132)

此问题已在此处有答案

Why is this VLA (variable-length array) definition unreliable?(1个答案)
15天前关闭。

int i;
   int n;
   int dizi[n];       
   printf(" N: ");
   scanf("%d",&n); // user input
     
   srand(time(0));   
      
    for (i = 0; i < n; i++) {   //
        
        dizi[i]=rand();
        printf("\n%d",dizi[i]);
        
    }

字符串
我试着做一个由用户输入大小的数组。当我在循环中输入10而不是n时,我的输出总是有六个变量。

deyfvvtc

deyfvvtc1#

代码中两个相关的东西导致了您看到的奇怪行为:1.代码在调用scanf(),2之前创建数组dizi[n]。由于 1.n没有被指定显式值,因此它的值仍然不确定。因此,您创建的数组的大小也是不确定的。
此外,如果不确定值恰好为正,则代码的行为至少将限于使用未知值来调整数组大小的效果。(通常称为软件错误)但是,如果值恰好为负,则会调用UB,从而极大地扩展代码可能表现出的潜在行为。没有一个是可预测的。
请参阅下面的建议以及解释变更的注解:

int main(void)
{
      //int i=0;//If you create here, initialize here. 
                //But better to create i at time
                //  it is needed i.e. in for loop
      int n=0;//initialize
            
      printf(" N: ");
      if(scanf("%d",&n) != 1) // user input
      {
          printf("scanf failed");
          return 0;
      }

      int dizi[n]; //move this declaration after value is set
      srand(time(0));
       for(int i = 0; i < n; i++){   //declare i at time it is needed
            dizi[i]=rand();
            printf("\n%d",dizi[i]);         
        }
    return 0;
}

字符串

balp4ylt

balp4ylt2#

编译器不知道n的值是什么

int n;
int dizi[n];

字符串
为您启动一个可变长度数组。这是undefined behavior(你称之为n的垃圾值),它取决于哪个值以前在编译器定义n的堆栈位置。在你的情况下,它是6,但可能是其他任何东西。

相关问题