• 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.

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ź 504 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ź 485 wizyt
pytanie zadane 29 stycznia 2019 w C i C++ przez Giero112 Nowicjusz (170 p.)

92,453 zapytań

141,262 odpowiedzi

319,087 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!

...