Legalne czy nielegalne operacje na tablicach
Ostatnio zmodyfikowano 2012-04-30 21:22
diego997 Temat założony przez niniejszego użytkownika |
Legalne czy nielegalne operacje na tablicach » 2012-04-30 19:12:57 Wcześniejszy problem nieaktualny ale przy szukaniu błędu natknąłem się na coś dziwnego. Program się skompiluje, dlaczego ? int tab[ 10 ][ 10 ] = { 0 };
cout << tab[ 0 ][ 12 ];
Program się nie skompiluje, dlaczego ? int tab[ 10 ][ 10 ];
cout << tab[ 0 ][ 12 ];
Dlaczego taka operacja jest możliwa jestem sobie w stanie wyobrazić, ale czy legalna, jakie jest prawdopodobieństwo, że nie natrafimy na zajęty obszar pamięci ? int tab[ 10 ];
tab[ 12 ] = 1;
cout << tab[ 12 ];
|
|
akwes |
» 2012-04-30 20:59:33 1. Oba pierwsze kody się kompilują u mnie w Dev i w Visualu... 2. Po prostu w c++ celem optymalizacji działań na tablicach, nie jest sprawdzane czy nie przekraczasz zakresu tablicy... |
|
Admixior |
» 2012-04-30 21:05:26 tak mi się zdaje że: jest to samo co: Zaraz przetestuje czy rzeczywiście tak jest. Poprawcie mnie jakbym się mylił //edit 2: jednak element tab[ 1 ][ 2 ] jest to ten sam(powprawiłem u góry kod), można to sprawdzić kodem: int main() { int tab[ 10 ][ 10 ]; tab[ 1 ][ 2 ] = 5; tab[ 0 ][ 12 ] = 6; std::cout << tab[ 1 ][ 2 ]; std::cin.get(); }
|
|
jankowalski25 |
» 2012-04-30 21:14:02 Jeśli program nie wykorzystuje informacji o rozmieszczeniu elementów w pamięci, to obiekty nie muszą być ustawione po kolei, ale mogą być optymalizowane. |
|
akwes |
» 2012-04-30 21:22:25 Eee #include <iostream> #include <conio.h>
int main() { int tab[ 10 ][ 10 ]; tab[ 1 ][ 1 ] = 7; std::cout << tab[ 0 ][ 11 ] << " " << &( tab[ 0 ][ 11 ] ) << "\n"; std::cout << tab[ 1 ][ 1 ] << " " << &( tab[ 1 ][ 1 ] ) << "\n"; std::cout << *( * tab + 11 ) << " " <<( * tab + 11 ); getch(); return 0; }
Po prostu kolega wyżej się walną o jedną liczbę... Policzył że 10 element tablicy 10 elementowej to 10 a nie 9, więc zamiast 9 + 2 wyszło mu 10 + 2. Poprawił już :) Przykładowy log 7 0x28fddc 7 0x28fddc 7 0x28fddc
|
|
« 1 » |