Поврежден стек вокруг переменной a

#arrays #c #sorting #for-loop #bubble-sort

#массивы #c #сортировка #for-цикл #пузырьковая сортировка

Вопрос:

 #include<stdio.h>

int main(void)
{
    int array[10] = { 10,2,9,4,5,6,7,8,3,1 };
    /*Implementing Bubble Sort */
    int temp;
    for (int i = 0; i < 9; i  )
    {
        for (int j = 0; j < 10 - i; j  )
        {
            if (array[j] > array[j   1])
            {
                temp = array[j];
                array[j] = array[j   1];
                array[j   1] = temp;
            }
        }
    }
    for (int i = 0; i < 10; i  )
    {
        printf("%d ", array[i]);
    }
}
 

Когда я пытаюсь запустить программу, я сортирую значения, но одно значение имеет некоторое мусорное значение, и появляется диалоговое окно, в котором указано, что стек вокруг переменной поврежден в VS 2019. В каком-то другом компиляторе я получаю 0 вместо 10 в компиляторе.

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

1. Шаг 1. Поместите это в свой отладчик и пошагово просмотрите его построчно, чтобы убедиться, что он работает правильно.

2. Да, я сделал это, на самом деле я пытался получить значение a[10] во внутреннем цикле for , которое не было определено, поэтому ошибка приходила

3. Мы все совершаем такие маленькие ошибки, как эта, так что хорошо, что вы смогли ее найти.

Ответ №1:

Внутренний цикл for .

 for (int j = 0; j < 10 - i; j  )
{
    if (array[j] > array[j   1])
    {
        temp = array[j];
        array[j] = array[j   1];
        array[j   1] = temp;
    }
}
 

вызывает неопределенное поведение, потому что когда j равно 9 для первой итерации внешнего цикла, то есть когда i равно 0 индексу в выражении array[j 1] , может быть равно 10 , что приводит к доступу к памяти за пределами массива.

Перепишите цикл следующим образом

 for (int j = 1; j < 10 - i; j  )
{
    if (array[j-1] > array[j])
    {
        temp = array[j-1];
        array[j-1] = array[j];
        array[j] = temp;
    }
}
 

Ответ №2:

Вы можете слегка отредактировать эту логику по сравнению с вашей.

 #include<stdio.h>

int main(void)
{
    int array[10] = { 10,2,9,4,5,6,7,8,3,1 };
    /*Implementing Bubble Sort */
    int temp;
    for (int i = 0; i < 10; i  )
    {
        for (int j = i; j < 10; j  )
        {
            if (array[i] > array[j])
            {
                temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
    }
    for (int i = 0; i < 10; i  )
    {
        printf("%d ", array[i]);
    }
}