• 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ą?

0 głosów
147 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 (51,380 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 VIP (105,860 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 VIP (105,860 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 VIP (105,860 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ź 78 wizyt
pytanie zadane 29 stycznia w C i C++ przez Giero112 Nowicjusz (170 p.)
0 głosów
1 odpowiedź 56 wizyt
pytanie zadane 14 marca w C i C++ przez Curiosis Początkujący (440 p.)
0 głosów
2 odpowiedzi 75 wizyt
pytanie zadane 29 listopada 2018 w C i C++ przez Ciecho Nowicjusz (150 p.)
Porady nie od parady
Komentarze do pytań nie służą do odpowiadania, od tego jest wydzielona sekcja odpowiedzi. Funkcją komentarzy jest natomiast możliwość uzyskania dodatkowych informacji na temat samego posta.Komentarze

65,676 zapytań

112,313 odpowiedzi

237,031 komentarzy

46,653 pasjonatów

Przeglądających: 134
Pasjonatów: 3 Gości: 131

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...