Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wychodzenie poza zakres tablicy, czy to mozliwe?

Ostatnio zmodyfikowano 2015-05-25 21:48
Autor Wiadomość
empty2102
Temat założony przez niniejszego użytkownika
Wychodzenie poza zakres tablicy, czy to mozliwe?
» 2015-05-25 20:59:43
Cześć wszystkim forumowiczom, aktualnie przerabiam kurs c++ poziom 2 tablice jednowymiarowe, z ciekawosci zaczalem bawic sie i testowac program wiec mam jedno pytanie otóż wg kursu wychodzenie poza tablice powinno mi wyrzucic blad krytyczny aplikacji, w moim przypadku tak nie jest. Uzywam codeblocka 12.11 kompilator mingw32-g++.
Z ciekawości sprawdziłem to przez couta i tablica zadeklarowana na 20 elementow przyjmuje takze 21szy element. Jest to mozliwe, czy myle sie? kod:
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int losowanie()
{
    int x =( rand() % 7 ) + 4;
    return x;
}
void wczytywanie()
{
    int i = 0;
    int tablica[ 20 ];
   
    do
    {
        tablica[ i ] = losowanie();
        cout << "twoje i: " << i << endl;
        cout << tablica[ i ] << endl;
        i++;
    } while( i <= 20 );
   
    cout << "tablica[20]=" << tablica[ 20 ] << endl;
    i = 1;
    int suma = tablica[ 0 ];
    do
    {
        suma = suma + tablica[ i ];
        i++;
    } while( i <= 20 );
   
    cout << "suma wynosi: " << suma << endl;
}

int main()
{
    srand( time( NULL ) );
    wczytywanie();
    return 0;
}
P-132779
pekfos
» 2015-05-25 21:38:38
otóż wg kursu wychodzenie poza tablice powinno mi wyrzucic blad krytyczny aplikacji
Gdyby tak było, życie było by łatwiejsze. To nie musi wyrzucić błędu. Nie jest to w żaden sposób sprawdzane, a pamięć komputera nie ogranicza się do tej twojej niewielkiej tablicy. Przed i po niej też jest pamięć i są tam dane, mniej lub bardziej istotne. Możesz sobie tam pisać, w najlepszym przypadku błąd wystąpi od razu. Jeśli jednak się tak nie stanie, będziesz mieć do czynienia z prawdopodobnie najgorszymi błędami, jakich można się w C++ nabawić - coś, gdzieś wyjdzie ci o ten jeden element poza tablicę i nadpisze pamięć, należącą do zupełnie innego miejsca w kodzie, nie wywołując błędu i nie dając żadnych objawów. Wykonanie dochodzi do tego innego miejsca i wtedy aplikacja się sypie. Ten kod jest dobry, wadliwy jest gdzieś po przeciwnej stronie projektu, który może mieć dziesiątki tysięcy linii kodu.
P-132782
empty2102
Temat założony przez niniejszego użytkownika
» 2015-05-25 21:48:07
Dziękuję Ci za tak wyczerpującą odpowiedź, teraz rozumiem dlaczego jest to tak ważne, po twoim poście będę mocno zwracał uwagę na takie niby drobnostki ale za to jakie ważne :) Wybacz że nie oprawiłem kodu w znaczniki, więcej się to nie powtórzy.
P-132784
« 1 »
  Strona 1 z 1