为什么我的相同C代码在编译时会产生不一致的结果

时间:2019-03-24 16:33:44

标签: c

我写了一些排序算法。为了简单起见,我选择了一个具有唯一值的小数组。每当我编译代码几次时,我都会得到正确的答案,但是有时我会得到一个带有错误的不同答案。我想知道是什么引起了问题。请注意,我正在使用相同的代码。

我正在使用GCC 4.2.1

我尝试使用在线编译器给出正确答案。

#include <stdio.h>

int main(){
  int i,j,k,l;
  int A[10]={2,10,6,24,1,-5,23,0,12,-100};

  for(i=0;i<10;i++){
    if(A[i+1]<A[i]){
      l=A[i+1];
      for(j=0;j<=i;j++){
        if((A[j]<A[i+1])&&(A[j+1]>A[i+1])){
          for(k=i;k>=j;k--){
            A[k+1]=A[k];
          }
          A[j+1]=l;
        }
        else if(A[0]>A[i+1]){
          for(k=i;k>=0;k--){
            A[k+1]=A[k];
          }
          A[0]=l;
        }
      }
    }
  }

  for(i=0;i<10;i++){
    printf("%d\n",A[i]);
  }
}

有时它给出: { -100, -5, 0, 1, 2, 6, 10 12 23 24 } 有时它给出: -791216026, -100, -5, 0, 1, 2, 6, 10 12 23 中止陷阱:6

3 个答案:

答案 0 :(得分:1)

您的程序读取了数组之后的内容。

i等于9时,A[j+1]会在i == j循环停止条件允许的for(j=0;j<=i;j++)时读取数组。

这也适用于A[k+1]

答案 1 :(得分:0)

这与您的编译无关。如果您多次运行同一个文件,则可能会发生这种情况。

由于您正在访问不包含特定值的A [10],因此您的程序可能会以不同的方式运行,如果A [10]中的值大于24,则该值将保持在其位置,并且正确的响应将打印出来,否则,它将传播到您的数字之间的某个地方。因此,您丢失了最后一个数字(24),并且数组中有一个随机值。

答案 2 :(得分:-1)

为我提供相同的结果{-100,-5,0,1,2,6,6,10,12,23,24},您可能会得到奇怪的数字的原因是因为数组用完了索引,但是除非代码保持不变,否则不应该发生。