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

Dlaczego możemy zwrócić z funkcji zmienną wskaźnikową?

VPS Starter Arubacloud
0 głosów
279 wizyt
pytanie zadane 21 grudnia 2017 w C i C++ przez k3ybo4rd Obywatel (1,180 p.)

Dlaczego kiedy deklarujemy za pomocą funkcji malloc tablicę i przypisujemy jej adres do wskaźnika do char to możemy go potem zwrócić z funkcji i kompilator nie daje ostrzeżeń, a kiedy zadeklarujemy tablicę to wtedy nie będziemy mogli zwrócić adresu tej tablic, a kompilator da ostrzeżenie w postaci

warning: function returns address of local variable [-Wreturn-local-addr]
  return bufor2;

char * some_sentence(char * strg, int k);

int main() {

        puts(some_sentence("WHERE AM I?", 5));
        return 0;
}

char * some_sentence(char * strg, int k){
        char * bufor = (char * ) malloc(sizeof(char) * strlen(strg) + 1);
        strcpy(bufor, strg); // kopiujemy do bufora
        char bufor2[] = "Who am I?";
        return bufor2; // zmienną wskaźnikową bufor możemy zwrócić, a już pierwszego adresu tablicy bufor2 nie
}

 

 

1 odpowiedź

+1 głos
odpowiedź 21 grudnia 2017 przez Bondrusiek Maniak (61,370 p.)

Witam,

zamień

char bufor2[] = "Who am I?";

na

char *bufor2 = "Who am I?";

Wtedy będziesz mógł zwrócić ten wskaźnik.

komentarz 21 grudnia 2017 przez k3ybo4rd Obywatel (1,180 p.)
No dobra ale chciałbym się dowiedzieć dlaczego mogę zwrócić zmienną wskaźnikową a np już zwykłej zmiennej z funkcji już nie mogę...
Przecież zmienne wskaźnikowe to też zmienne lokalne w tej funkcji tak?
komentarz 21 grudnia 2017 przez Bondrusiek Maniak (61,370 p.)

Chciałbym się dowiedzieć dlaczego mogę zwrócić zmienną wskaźnikową a np już zwykłej zmiennej z funkcji już nie mogę

W funkcji możesz zwrócić każdy typ(int, double, char itd). Zauważ jeszcze co zwraca Twoja funkcja char*

komentarz 21 grudnia 2017 przez k3ybo4rd Obywatel (1,180 p.)
adres?
1
komentarz 21 grudnia 2017 przez Bondrusiek Maniak (61,370 p.)

Adres to nie jest typ wbudowany tylko wartością gdzie znajdują się zmienne.

https://stackoverflow.com/questions/5286451/how-to-print-variable-addresses-in-c

Możesz zwrócić adres używając referencji np.

jakis_typ& funkcja()

komentarz 21 grudnia 2017 przez k3ybo4rd Obywatel (1,180 p.)
NO TAK RACJA :-D
komentarz 21 grudnia 2017 przez j23 Mędrzec (194,920 p.)

Chciałbym się dowiedzieć dlaczego mogę zwrócić zmienną wskaźnikową a np już zwykłej zmiennej z funkcji już nie mogę

Próbujesz zwrócić adres na tablicę lokalną, która po wyjściu z funkcji (teoretycznie) przestaje istnieć.

komentarz 21 grudnia 2017 przez k3ybo4rd Obywatel (1,180 p.)
Też prawda j23

W takim razie kiedy napiszę return bufor; to zwrócę też adres do tablicy i co się dzieje po wyjściu z funkcji ona dalej istnieje ta tablica??
1
komentarz 21 grudnia 2017 przez j23 Mędrzec (194,920 p.)

bufor zawiera wskaźnik na tablicę, która leży na stercie. To inny rodzaj pamięci. Dlatego po wyjściu z funkcji adres jest wciąż poprawny. Zmienne lokalne, a bufor2 to tablica lokalna, tworzone są na stosie i istnieją tak długo, jak długo jesteś w bloku, w którym zostały zdefiniowane.

komentarz 21 grudnia 2017 przez k3ybo4rd Obywatel (1,180 p.)
Czyli to zgadza się z moimi domysłami, miałem już zapytać Ciebie czy to ma coś wspólnego ze stosem i stertą :-)

Czyli wniosek taki że sterta jest wspólna dla wszystkich wątków?
1
komentarz 21 grudnia 2017 przez j23 Mędrzec (194,920 p.)
Inaczej. Zmienne lokalne są automatycznie niszczone, i trzeba o tym pamiętać. Zwracanie adresów/referencji do zmiennych lokalnych jest po prostu błędem.

Wątków bym w to nie mieszał...
komentarz 21 grudnia 2017 przez k3ybo4rd Obywatel (1,180 p.)
To w takim razie jak to nazwać? Jeżeli błędne jest stwierdzenie że sterta jest wspólna dla wszystkich watkow... Jak inaczej ująć to prawidłowo slowami?
komentarz 21 grudnia 2017 przez j23 Mędrzec (194,920 p.)
Ono nie jest błędne, tylko ma się nijak do tematu. Zresztą, aplikacja może mieć kilka stert ;) To, co jest wspólne dla wszystkich wątków, to wspólna przestrzeń adresowa. Każdy wątek ma swój stos, ale z racji tego, że stos leży we wspólnej przestrzeni adresowej, dane w nim zawarte są/mogą być dostępne dla innych wątków. I tak samo jest z pamięcią sterty...

Podobne pytania

0 głosów
1 odpowiedź 505 wizyt
pytanie zadane 26 października 2020 w C i C++ przez komboboost0 Użytkownik (570 p.)
0 głosów
1 odpowiedź 507 wizyt
pytanie zadane 14 marca 2019 w C i C++ przez Curiosis Użytkownik (540 p.)
0 głosów
1 odpowiedź 486 wizyt
pytanie zadane 29 stycznia 2019 w C i C++ przez Giero112 Nowicjusz (170 p.)

92,455 zapytań

141,263 odpowiedzi

319,100 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...