desperat96 Temat założony przez niniejszego użytkownika |
Zarządzanie pamięcią C - realloc w funkcji » 2018-05-12 16:22:00 Witam, mam sobie kod który jak dla mnie działa dziwnie, albo jak zwykle robię coś źle, ale szukałem w internecie, pytałem znajomych i nikt nie powiedział czemu sie tak dzieje. Kod #include <stdlib.h> #include <stdio.h> void red( int * ); int main() { int * wsk, i; wsk =( int * ) malloc( 15 * sizeof( int ) ); for( i = 0; i < 15; i++ ) { wsk[ i ] = i + 100; printf( "%d numer wskaznika:%p \n", wsk[ i ], wsk + i ); } printf( "\n\n" ); red( wsk ); printf( "\n\n" ); for( i = 0; i < 25; i++ ) { printf( "%d numer wskaznika:%p \n", wsk[ i ], wsk + i ); } free( wsk ); return 0; } void red( int * wskaznik ) { int i; wskaznik = realloc( wskaznik, 20 * sizeof( int ) ); for( i = 0; i < 25; i++ ) { printf( "%d numer wskaznika:%p \n", wskaznik[ i ], wskaznik + i ); } }
Jak widać rezerwuję pamięć na 15 intów, potem je wypełniam i chcę zwiększyć rozmiar pamięci przez funkcję red, w funkcji wszystko spoko, rozmiar się zmienia, zwraca nowy wskaźnik na obszar pamięci, ale potem jak wracam do maina to zmiena *wsk ma nadal stary wskaźnik, który przecież zmieniła funkcja red, a wyświetlany jest obszar już zwolnionej pamięci, zamiast nowej. Tak jakbym przekazywał do tej funkcji wskaźnik, ona go zwalniała, ale nie przypisała nowego, tylko zostawiła stary. Męczę się z tym od wczoraj, kombinowałem na wiele sposbów, zrobiłem żeby funkcja red, zwracała nowy wskaźnik i przypisywałem go do starego, ale przecież z funkcji void dzieje się to samo, bo przekazuje wskaźnik do pamięci, a nie wartość. Jakby ktoś wiedział co jest nie tak, bo nie mogę ruszyć dalej i się tylko męcze nad tym. |
|
pekfos |
» 2018-05-12 16:51:26 |
|
desperat96 Temat założony przez niniejszego użytkownika |
» 2018-05-12 16:55:29 Tylko że ja to robię wskaźnikiem, przekazuje wskaźnik do tej funkcji. |
|
pekfos |
» 2018-05-12 17:04:10 A jednak dalej nie działa i dostałeś taką właśnie odpowiedź. Wróć jak zapoznasz się z podanym materiałem. |
|
desperat96 Temat założony przez niniejszego użytkownika |
» 2018-05-12 17:11:44 dobra, wskaźnik do wskaźnika i wszystko działa, dzięki za pomoc |
|
desperat96 Temat założony przez niniejszego użytkownika |
» 2018-05-15 22:54:03 Tylko pojawił się problem, bo zrobiłem to wszystko przez wskaźniki do wskaźników, pokazałem prowadzącemu na studiach i powiedział że nie powinienem tak robić, że sami int *wsk przekazywane do funkcji powinno zmieniać ten wskaźnik, bez używania wskaźnika do wskaźnika, bo wskaźnik jest przekazywany przez referencję. I tu jest dziwna rzecz bo na moim komputerze jak przekazuje zwykły wskaźnik, to działa źle, a na komputerze na uczelni wszystko działa dobrze. I w sumie nie wiem co robić, jeden mówi tak, drugi tak. |
|
pekfos |
» 2018-05-15 22:59:04 Jak to kompilujesz na uczelni? I czym? |
|
desperat96 Temat założony przez niniejszego użytkownika |
» 2018-05-15 23:01:21 codeblocksem wersja chyba 13.12, w domu mam najnowszą wersję codeblocksa, normalnie kompiluję, robię wszystko tak samo jak w domu, kod identyczny a działa inaczej. |
|
« 1 » 2 |