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

Przypisywanie do wskaźnika innego wskaźnika zwracanego przez funkcję

Aruba Cloud - Virtual Private Server VPS
0 głosów
732 wizyt
pytanie zadane 5 kwietnia 2022 w C i C++ przez coderCpp93 Gaduła (4,200 p.)

Cześć, dawno mnie tu nie było, ale sięgam po ostatnią deskę ratunku.

Mam funkcję:

const int* fun(const int* arr, size_t size, int& min)
{
    int wielokrotnoscTmp = 0;

    for (int i = 1; i < size; i++)
    {
        if (arr[i] < min)
            min = arr[i];
    }

    for (int i = 0; i < size; i++)
    {
        if (arr[i] % min == 0 && arr[i] / min > wielokrotnoscTmp / min)
            wielokrotnoscTmp = arr[i];
    }

    const int* wielokrotnosc = &wielokrotnoscTmp;

    return wielokrotnosc;
}

zwracającą wskaźnik statyczny. Oraz wywołanie tej funkcji wraz z wyświetleniem wartości w funkcji main()

const int* funResult = fun(tab, 20, min);
std::cout << *funResult << std::endl;

No i problem w tym, że funkcja działa prawidłowo, ale te wywołanie nie zupełnie. Chcąc wyświetlić wartość wskazywaną przez wskaźnik wypisuje na wyjściu wartość 0. Zupełnie nie wiem czemu. Funkcja fun działa prawidłowo, bo testowo w środku tej funkcji wypisywałem wartość wskaźnika taka jaka powinna, a w main już nie.

Dzięki z góry za odpowiedź.

Pozdrawiam

1 odpowiedź

+1 głos
odpowiedź 5 kwietnia 2022 przez adrian17 Mentor (352,580 p.)

GCC ładnie mówi:

<source>:22:12: warning: function returns address of local variable [-Wreturn-local-addr]
   22 |     return wielokrotnosc;
      |            ^~~~~~~~~~~~~
<source>:6:9: note: declared here
    6 |     int wielokrotnoscTmp = 0;
      |         ^~~~~~~~~~~~~~~~

Twoja funkcja zwraca adres zmiennej lokalnej. Gdy wychodzisz z funkcji, zmienna przestaje istnieć, więc wskaźnik wskazuje na pamięć na stosie która już nie należy do Ciebie i która mogła zostać w międzyczasie nadpisana - i tak się u Ciebie stało.

Ogólnie nie rozumiem co i po co chcesz tutaj zrobić, jak możesz po prostu zwrócić inta `wielokrotnoscTmp`.

komentarz 5 kwietnia 2022 przez coderCpp93 Gaduła (4,200 p.)
Dzięki za odpowiedź. Zwracam wskaźnik bo takie mam zadanie do szkoły, ćwiczenie wskaźników.
komentarz 6 kwietnia 2022 przez Oscar Nałogowiec (29,340 p.)
edycja 6 kwietnia 2022 przez Oscar

Zwracaj adres na element tablicy. Po co przepisywać wartość z tablicy do zmiennej lokalnej a potem zwracać wskaźnik na zmienną lokalną. Przecież ta sama wartość jest w tablicy. Pewnie właśnie o to chodziło.

Czy nie powinieneś przerwać pętli po znalezieniu pierwszej wielokrotności?
<EDIT> Już widzę, że szukasz największej wielokrotności, więc trzebe przejrzeć całą tablicę. Zapamiętuj jednak nie wartość a pozycję tego maxa. (wskaźnik lub indeks) </EDIT>

Nie inicjujesz min - zakładasz że kod wyżej to zrobi?


Dzielenie obu stron nierówności przez tą samą liczbę nie na sensu matematycznego (a zawsze liczby są podzielne całkowicie). <EDIT>Szczególnie, że min może wyjść zero a przez zero się nie dzieli.</EDIT>

Podobne pytania

0 głosów
1 odpowiedź 250 wizyt
0 głosów
1 odpowiedź 202 wizyt
0 głosów
3 odpowiedzi 334 wizyt
pytanie zadane 27 listopada 2017 w JavaScript przez lapacz.kornel Mądrala (6,930 p.)

93,327 zapytań

142,325 odpowiedzi

322,396 komentarzy

62,657 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...