dejmieno Napisano Styczeń 15, 2019 Udostępnij Napisano Styczeń 15, 2019 Witam, Chcialem sie was zapytac, czy ta funkcja jest poprawna? Czy takie rozwiazanie nie bedzie powodowac wyciekow pamieci? Czy rozmiar tablicy jest dobrze alokowany? char * subarray; char buffor[30]; uint8_t bufforElementsNumber = 0; char * getSubArray(int size, char array[]) { subarray = NULL; subarray = malloc(sizeof(char) * size); for (int i = 0; i < size; i++) { subarray[i] = array[i]; } return subarray; } Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Styczeń 15, 2019 Udostępnij Styczeń 15, 2019 Jeśli pytasz o poprawność funkcji to przydałaby się komentarze lub słowny opis tego, co według Ciebie (i jak) robi dany fragment kodu. Inaczej może się okazać, że ktoś potwierdzi poprawność kodu, a całość będzie działała inaczej niż myślisz 😉 Link do komentarza Share on other sites More sharing options...
dejmieno Styczeń 16, 2019 Autor tematu Udostępnij Styczeń 16, 2019 Ta funkcja przyjmuje tablice ( w praktyce jest to tablica buffor ) i tworzy podtablice o danym rozmiarze. Tylko teraz nie wiem czy taka praktyka nie spowoduje wycieku pamieci? Teraz sobie mysle ze jednak NULL jest nie wystarczajacy bo przeciez tylko nullujemy wskaznik ale zalokowany blok pamieci pozostaje prawda? getSubArray jest wykonywany w petli i zastanawiam sie czy przy ktoryms cyklu nie wylecie OutOfMemory. Zastanawiam sie czy przed kazdym wywolaniem getSubArray nie powinienem wywolac free(&subarray)? Link do komentarza Share on other sites More sharing options...
ethanak Styczeń 16, 2019 Udostępnij Styczeń 16, 2019 free(subarray) przede wszystkim. pamięć się oczywiście sama magicznie nie zwolni. poczytaj o funkcjach realloc i alloca. Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
narbej Styczeń 16, 2019 Udostępnij Styczeń 16, 2019 39 minut temu, dejmieno napisał: Tylko teraz nie wiem czy taka praktyka nie spowoduje wycieku pamieci? Tak, może [i pewnie tak będzie] spowodować. Jeżeli jest malloc(), to powinien być free, gdy już nie potrzebujesz. Chyba, że masz to w niewidocznej części programu. A takie, głupie pytanie, w czym programujesz? 😉 47 minut temu, dejmieno napisał: Zastanawiam sie czy przed kazdym wywolaniem getSubArray nie powinienem wywolac free(&subarray)? Nie, a szczególnie przed pierwszym - wtedy jeszcze subarray == Null i nie jestem pewny, czy C nie wywali się [niestety przeszedłem na C++] Link do komentarza Share on other sites More sharing options...
dejmieno Styczeń 17, 2019 Autor tematu Udostępnij Styczeń 17, 2019 (edytowany) 18 godzin temu, narbej napisał: A takie, głupie pytanie, w czym programujesz? 😉 Na codzien programuje w jezykach wysokiego poziomu Java & Kotlin, wiec pewne elementy z C ktore normalnie zalatwia Garbage Collector musze ogarnac. Ale w sumie mozna bardzo wiele sie nauczyc. Ok, wykorzystalem funkcje free, tylko teraz pytanie czy powinienem przekazac tablice czy & referencje do tablicy? Czy tablica domyslnie nie jest przekazywana jako referencja? Rozumiem ze po wywolaniu free to normalne ze we wskazniku wskazniku sa jakies dane poniewaz tylko zwolnilem pamiec a wskaznik nadal wskazuje na jakis blok pamieci tylko ze pusty? Dobrze rozumiem? Edytowano Styczeń 17, 2019 przez dejmieno 1 Link do komentarza Share on other sites More sharing options...
ethanak Styczeń 17, 2019 Udostępnij Styczeń 17, 2019 To jest z tego co widzę C a nie C++, więc nie istnieje pojęcie referencji a jedynie wskaźnik. W związku z tym dość trudno cos przekazać przez referencję... Wskaźnik w przeciwieństwie do referencji może wskazywać na cokolwiek, Twoim zadaniem jest przypilnowanie aby w przypadku kiedy wskazuje na zwolniony blok pamięci więcej go nie używać. 1 Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »