• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Inne miejsce w pamieci

Object Storage Arubacloud
0 głosów
134 wizyt
pytanie zadane 3 czerwca 2016 w C i C++ przez chacken Użytkownik (820 p.)
edycja 3 czerwca 2016 przez chacken

Ktoś mi wytłumaczy czemu ta referencja ma inne miejsce w pamięci niż tablica ;)?

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <ctime>
using namespace std;

char* maxn(char** tab,int);

int main()
{
    char *tablica[5] = {"Zdanie pierwsze", "Hej", "ABECADLO", "Yo no tengo quiera najdluzsze", "bye"};
    char* &&a = maxn(tablica,5);
    cout << "Najdluzsze slowo: " << &a << " na adresie: " << " Tablica: " << &tablica[3];

//tablica o adresie &tablica[3] w pamieci ma adres 0x28ff00
//referencja &&a do tej wartosci w tablicy w pamięci ma adres 0x28ff08
//8 bitów różnicy.... ktoś mi wytłumaczy dlaczego ;)?
//działać działa, sam sobie utrudniam... ale próbuję w 100% zrozumieć referencjei kombinuje ile wlezie :P
//EDIT: Problem jest większy :P Mianowicie pod &a zawsze jest ten sam adres (0x28ff08)
//niezależnie od wyniku funkcji maxn();
//już kompletnie nie czaję :P


    return 0;
}


char* maxn(char** tab,int a){
    int g=0;
    for(int i=0;i<a;i++) g = strlen(tab[i]) > strlen(tab[g]) ? i : g;
    return tab[g];
}

 

1 odpowiedź

+1 głos
odpowiedź 3 czerwca 2016 przez Radfler VIP (101,030 p.)
edycja 11 czerwca 2016 przez Radfler
 
Najlepsza

Dlatego, że ta referencja odwołuje się do wskaźnika, który został zwrócony przez funkcję maxn, a nie bezpośrednio do elementu tablicy. Gdybyś zmienił funkcję na taką:

char*& maxn(char** tab, int a);

To wtedy adresy będą takie same.

#PS Zadbaj o prawidłowy const funkcji i tablicy.

komentarz 3 czerwca 2016 przez chacken Użytkownik (820 p.)

Dzięki ! :D Zmodyfikowałem również (poniższy kod) na podstawie tego co zaproponowałeś powyżej i działa ALE... nie wiem dlaczego to działa ;/
Korzystając z okacji proszę spróbuj jakoś po krótce wytłumaczyć.... co tak naprawde zwraca się z tych funkcji ....

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <ctime>
using namespace std;

template <typename T>
T &maxn(T *,int);
template <> char *& maxn(char** tab,int);

int main()
{
    char *tablica[5] = {"Pierwsze zdanie", "hej", "ABECADLO", "Yo no tengo quiera najdluzsze", "bye"};
    double d[4]={1.54,4.67,12.865,4.90};
    int g[5]={4,5,2,3,1};
    char*&a = maxn(tablica,5);
    cout << "Najwieksza z double: " << maxn(d,4) << endl;

//wszystko działa jak należy, tylko co tak naprawdę
//zwraca powyzsza funkcja?
//jak dla mnie to jakoś nielogiczne... niby funkcja zwraca referencję na zmienną wynik
//która z kolei jest zmienną lokalną funkcji....
// nie powinien wyskoczyć jakiś błąd ? czy coś :P?

    cout << "Najwieksza z int: " << maxn(g,5) << endl;

// to samo pytanie tutaj 

    cout << "Najdluzsze slowo: " << &a << " na adresie: " << " Tablica: " << &tablica[2];
    return 0;
}

template <typename T>
T &maxn(T * t,int a){
    T wynik=0;
    for(int i=0;i<a;i++) wynik = t[i] < wynik ? wynik : t[i];
    return wynik;
}
template <> char *& maxn(char** tab,int a){
    char * pt;
    int g=0;
    for(int i=0;i<a;i++) g = strlen(tab[i]) > strlen(tab[g]) ? i : g;
    return tab[g];
}

 

komentarz 3 czerwca 2016 przez Radfler VIP (101,030 p.)
cout << "Najwieksza z double: " << maxn(d,4) << endl;
cout << "Najwieksza z int: " << maxn(g,5) << endl;

Tak się w C++ nie robi. Funkcja maxn dla tych argumentów zwraca referencję do zmiennej lokalnej, co skutkuje niezidentyfikowanym zachowaniem. Także oba te wywołania zwracają referencję do... śmieci.

#PS Zadbaj o dobry const!

main.cpp:13:101: warning: ISO C++ forbids converting a string constant to 'char*' [-Wpedantic]
main.cpp:13:101: warning: ISO C++ forbids converting a string constant to 'char*' [-Wpedantic]
main.cpp:13:101: warning: ISO C++ forbids converting a string constant to 'char*' [-Wpedantic]
main.cpp:13:101: warning: ISO C++ forbids converting a string constant to 'char*' [-Wpedantic]

Podobne pytania

0 głosów
1 odpowiedź 413 wizyt
pytanie zadane 14 sierpnia 2016 w C i C++ przez SebekMakaron Obywatel (1,290 p.)
0 głosów
1 odpowiedź 9,435 wizyt
pytanie zadane 31 lipca 2016 w C i C++ przez Iamhexi Obywatel (1,330 p.)
0 głosów
2 odpowiedzi 1,752 wizyt

92,555 zapytań

141,404 odpowiedzi

319,559 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...