wiktor12348 Temat założony przez niniejszego użytkownika |
[ANSI C] Czyszczenie tablicy wskaźnikowej » 2014-10-19 12:57:23 Witam, Tym razem postaram się opisać problem dokładniej. Moim zdaniem było napisanie programu w Ansi C (ważna sprawa). Częścią zadania było alokacja dynamicznej tablicy a później alokacja dynamicznych struktur na tablice. Oczywiście na końcu mam ją zwolnić. Jedna z funkcji ma stworzyć taką strukturę danych a później przez argument inne funkcje pobierają wskaźnik na nią i robią obliczenia, sortowania itp. Generalnie takich danych jest ponad 100 tys. i więcej. pierwsza ** tab =( pierwsza ** ) malloc( sizeof( pierwsza * ) * n );
By zwolnić dynamiczną tablice, tworzyło się pętle i leciało po wszystkich komórkach. Mniej więcej: for( int i = 0; i < n; i++ ) free( tab[ i ] );
free( tab );
Próbowałem tak zrobić w moim przypadku, mam błąd (jak się można domyślać przy zwolnieniu pamięci). Jak poprawnie zwolnić pamięć? |
|
pekfos |
» 2014-10-19 13:36:01 Jak poprawnie zwolnić pamięć? |
Pytanie powinno brzmieć, jak poprawnie tą pamięć zaalokować ;) Zwalniasz n + 1 bloków, a malloc() wywołujesz raz.. |
|
wiktor12348 Temat założony przez niniejszego użytkownika |
» 2014-10-19 14:02:42 Puściłem śledzenie, wywala mi błąd przy pierwszym kółku: SDiZOLAB1.exe has triggered a breakpoint.
Podaje też linijkę w dbgheap.c Może trochę kodu: pierwsza ** Stworz( int d ) { pierwsza ** tab =( pierwsza ** ) malloc( sizeof( pierwsza * ) * d ); for( int i = 0; i < d; i++ ) { pierwsza * add =( pierwsza * ) malloc( sizeof( pierwsza * ) ); tab[ i ] = add; } return tab; } int zlicz( pierwsza ** tab, int n, char z ) { } void czysc( pierwsza ** tab, int n ) { for( int i = 0; i <( n - 1 ); i++ ) { free( tab[ i ] ); } free( tab ); }
|
|
pekfos |
» 2014-10-19 14:09:25 pierwsza * add =( pierwsza * ) malloc( sizeof( pierwsza * ) );
|
Alokujesz pamięć pod wskaźnik, a nie obiekt. |
|
wiktor12348 Temat założony przez niniejszego użytkownika |
» 2014-10-19 14:11:53 Właśnie przed chwilą miałem łamigłówkę pierwsza * add =( pierwsza * ) malloc( sizeof( pierwsza ) );
Poprawnie? |
|
pekfos |
» 2014-10-19 14:14:16 A działa? for( int i = 0; i <( n - 1 ); i++ ) {
|
Na pewno potrzebujesz odjąć 1 od n? |
|
wiktor12348 Temat założony przez niniejszego użytkownika |
» 2014-10-19 14:21:40 Raczej nie. Ostatnie pytanie. Sortuje przez scalanie (mergesort) i nawet szybko idzie. Jednak przy tym sortowaniu potrzebna jest tablica tymczasowa ją też alokuje dynamicznie ale jestem pierdoła i nie umiem jej poprawnie zdefiniować i zwolnić. Generalnie działa, ale znając życie nie jest to poprawnie. void mergeSort( pierwsza ** arr, int low, int mid, int high ) { int i, m, k, l; pierwsza ** temp =( pierwsza ** ) malloc( sizeof( pierwsza ) * 400000 ); if( arr[ l ]->a <= arr[ m ]->a ) { temp[ i ] = arr[ l ]; l++; } free( temp ); }
Tak to działa, ale mam dylemat, czy poprawnie czyszczę pamieć? |
|
pekfos |
» 2014-10-19 14:27:54 pierwsza ** temp =( pierwsza ** ) malloc( sizeof( pierwsza ) * 400000 );
|
Jak masz stały rozmiar, to nie powinieneś bawić się w dynamiczną pamięć. (Przy typie w sizeof powinno być *, btw). Podaj aktualny, w miarę kompletny kod. |
|
« 1 » 2 3 |