#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), и случайное значение попадает в ваш массив.