Przydzielanie i adresowanie pamięci.
Ostatnio zmodyfikowano 2016-08-23 00:07
mich2803 Temat założony przez niniejszego użytkownika |
Przydzielanie i adresowanie pamięci. » 2016-08-22 17:24:31 Mam pytanie odnośnie przydzielania pamięci przez kompilator (konkretnie visual studio). Mam kod takiego programu: #include <iostream>
const int SIZE = 5;
int * fill_array( int * begin, int size ); void show_array( int * begin, int * end ); void revalue( int * begin, int * end, int value );
int main() { using namespace std; int table[ SIZE ]; show_array( table, fill_array( table, SIZE ) ); } int * fill_array( int * begin, int size ) { using namespace std; int i = 0; for( i = 0; i < size; i++ ) { cout << "Podaj wartosc " << i + 1 << " elementu: "; cin >> begin[ i ]; if( cin.fail() ) { cin.clear(); while( cin.get() != '\n' ) continue; return & begin[ i + 1 ]; } } return & begin[ i + 1 ]; }
void show_array( int * begin, int * end ) { using namespace std; int i = 0; for( begin; begin !=( end - 1 ); begin++ ) { cout << * begin << endl; cout << & begin[ i ] << endl; i++; } cout << & end << endl; }
Moje pytanie brzmi: Dlaczego adres zwracany przez funkcje fill_array jest mniejszy od adresu pierwszego elementu tablicy table ? W założeniu program ma zwracać wskaźnik ustawiony tuż za ostatnim elementem wprowadzonym do tablicy (i adres tego wskaźnika powinien być większy od ostatniego elementu tablicy o liczbę bajtów jaką zajmuje przechowywana w tablicy zmienna). |
|
pekfos |
» 2016-08-22 17:42:29 A gdzie ty ten adres wypisujesz? ..bo to nie wypisuje wartości zwróconej z fill_array(). |
|
mich2803 Temat założony przez niniejszego użytkownika |
» 2016-08-22 23:27:57 W takim razie możesz mi powiedzieć co to za adres wypisuje ? Bo wartością zwracaną przez fill_array jest wskaźnik do następnego elementu po ostatnim wprowadzonym do tablicy (bynajmniej takie było założenie). Teraz jeszcze wymyśliłem że może to być wskaźnik do kolejnego bloku pamięci znajdującego się za tablicą tab, bo tablica nie jest alokowana dynamicznie. Tak czy tak wartość adresu komórki wskazywanej przez end powinna być większa. Ale jak napisałeś cout nie wyświetla wartości zwracanej przez fill_array (w założeniu miał wyświetlać adres wskaźnika zwracanego przez fill_array). |
|
michal11 |
» 2016-08-22 23:38:12 Operator & służy do otrzymania adresu zmiennej. W twoim przypadku & end zwraca adres zmiennej end (bez względu na to jakiego ona jest typu <pomijam oczywiście przeładowanie operatora & dla własnego typu>) więc dostajesz adres wskaźnika a nie adres tego na co ten wskaźnik wskazuje. |
|
mich2803 Temat założony przez niniejszego użytkownika |
» 2016-08-23 00:03:38 Ok myślałem że w przypadku wskaźników to działa inaczej. &(*end) rozwiązało problem. Ale z czystej ciekawości dlaczego adres wskaźnika jest mniejszy od adresu tablicy. Kompilator rezerwuje dla niego pamięć podczas wywołania funkcji (w jej prototypie czy deklaracji)? |
|
michal11 |
» 2016-08-23 00:07:24 |
|
« 1 » |