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

Przydzielanie i adresowanie pamięci.

Ostatnio zmodyfikowano 2016-08-23 00:07
Autor Wiadomość
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:
C/C++
#include <iostream>
// constans valuers
const int SIZE = 5;

//prototype of function
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;
    //cout << &end - &begin << 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).
P-151029
pekfos
» 2016-08-22 17:42:29
A gdzie ty ten adres wypisujesz?
C/C++
cout << & end << endl;
..bo to nie wypisuje wartości zwróconej z fill_array().
P-151030
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).
P-151038
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.
P-151039
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)?
P-151041
michal11
» 2016-08-23 00:07:24
Wystarczy
cout << end;
.

P-151042
« 1 »
  Strona 1 z 1