Почему мой же код на C выдает противоречивые результаты при компиляции

#c

#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])amp;amp;(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("%dn",A[i]);
  }
}
  

иногда это дает:
{
-100,
-5,
0,
1,
2,
6,
10,
12,
23,
24,
}
Иногда это дает:
-791216026,
-100,
-5,
0,
1,
2,
6,
10,
12,
23,
Ошибка прерывания: 6

Комментарии:

1. "sort.c:8:9: runtime error: index 10 out of bounds for type 'int [10]'" используйте более свежий GCC с -fsanitize=undefined -Wall -Wextra -Werror -pedantic

2. int A[10] означает, что вы можете хранить только 10 int элементы в A , но вы храните больше, чем это, что вызывает неопределенное поведение.

3. A [i 1] индексирует массив, выходящий за пределы.

4. У вас есть int A[10]= ... , тогда for(i=0;i<10;i ){ , тогда if(A[i 1]<A[i]){ . Для i = 9 вы получаете доступ A[10] , который выходит за рамки.

5. Т.е. просто выполните цикл для i < 10 - 1

Ответ №1:

Ваша программа считывает данные из массива.

При i равенстве 9 , A[j 1] считывается из массива, когда i == j что разрешено вашим for(j=0;j<=i;j ) условием остановки цикла.

Это также относится к A[k 1]

Ответ №2:

Дело не в вашей компиляции. Это может произойти, если вы запускаете один и тот же файл несколько раз.

поскольку вы обращаетесь к [10], который не содержит определенного значения, ваша программа может вести себя по-разному, если значение в [10] больше 24, это значение остается на своем месте, и будет напечатан правильный ответ, в противном случае он будет распространяться где-то между вашими числами. итак, вы убираете свое последнее число (24), и случайное значение попадает в ваш массив.