Ошибка при работе с массивами.

Ошибка при работе с массивами.

Приветствую всех! У меня вот какая проблема. Начал учится языку С++ относительно недавно. Пока все было хорошо. Но столкнулся с проблемой с массивами. Программа работает нормально, но после завершения работы вылазит окно с таким описание ошибки : «Run-Time Check Failure #2 — Stack around the variable 'arr' was corrupted.»
Вот внизу вроде бы нормальный код по генерации массива и его сортировке. Уже два дня ищу, где ошибка. Помогите найти, что не так.

#include<iostream>
using namespace std;

int main()
{
    int arr[10];
    int i, k;
    int sw;
    for (i=0; i<11; i++)
        arr[i] = (1 + rand() % 100);
    for (i=0; i<11; i++) 
    {
        for (k=10; k>(i-1); k--) 
        {
            if (arr[k-1] > arr[k])
            {
                sw = arr[k-1];
                arr[k-1] = arr[k];
                arr[k] = sw;
            }
        }
    }
    for (i=0; i<11; i++) 
        cout << arr[i] << endl;
    system("pause");
    return 0;
}

Я особо не вникал, но во фрагменте

    int arr[10];
    ...
    for (i=0; i<11; i++)
        arr[i] = (1 + rand() % 100);

ты вылетаешь за границу массива. Причём при присваивании, что вдвойне плохо.

От 0 до 10 включительно — 11 итераций цикла, а размер массива у тебя 10 элементов. На этом ты и получаешь «stack corrupted». (Это у тебя во всех циклах.)

Надо запомнить сишную идиому для прохода по массиву:

    int arr[N];
    for (i = 0; i < N; i++)
        ...

А вообще лучше размер массива задавать не литералом (т.е. просто числом), а через символическую константу. Тогда при необходимости изменения размера массива надо будет внести изменение только в константе, а не просматривать весь код и поправлять числа:

const int ARR_LEN = 10;
int main() {
    ...
    int arr[ARR_LEN];
    ...
    for (i = 0; i < ARR_LEN; i++)
        arr[i] = (1 + rand() % 100);
    ...

Привет, Денис, здесь на форуме, в одной из заметок, я читал о том, что нужно к коду прилагать комментарии.
Объясни в кратце, что делает твоя программа, кроме нахождения остатка от случайных чисел, конечно:)
Обрати внимание на объявление int arr[10];. Ты объявляешь размер массива 10 элементов типа int, а в управляющем разделе операторов for, переменную i сравниваешь с 11.
Ты наверное, забыл, что нумерация массивов начинается с нуля, значит, переменная i должна быть < 10 . Поэтому, если переписать код вот так:

#include <iostream>
#include <stdlib.h>

int main()
{
    using namespace std;
    int arr[10];
    int i, k;
    int sw;
    for (i=0; i<10; i++)
        arr[i] = (1 + rand() % 100);
    for (i=0; i<10; i++) 
    {
        for (k=10; k>(i-1); k--) 
        {
            if (arr[k-1] > arr[k])
            {
                sw = arr[k-1];
                arr[k-1] = arr[k];
                arr[k] = sw;
            }
        }
    }
    for (i=0; i<10; i++) 
        cout << arr[i] << endl;

    Console::ReadLine();
    return 0;
}

то, я думаю, все заработает:)

Спасибо вам! Вы были правы насчет выхода за границы в циклах. Но и в строчке
for (k=10; k>(i-1); k--) должно быть не k=10, а k=9. Я просто раньше воспринимал arr[10] как массив из 11 элементов от 0 до 10 включительно.
Еще раз спасибо!!!

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.