[c] Pytanie teoretyczne o pamiec

soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[c] Pytanie teoretyczne o pamiec

Post autor: soku11 »

WITAM!
Mam takie pytanie. Moj programik allokuje dynamicznie pamiec na pewne struktury, ktore sa ze soba polaczone poprzez wskazniki w tych strukturach (drzewo, lista, niewazne...). Mam zmienna globalna struct lista* poczatek. Jest ona polaczona z zalozmy 10 innymi strukturami. Teraz jesli zrobie cos takiego:

Kod: Zaznacz cały

struct lista *tmp=start;
start=(struct lista*)malloc(sizeof(struct lista));
start->pole1=1;
...
tmp=start;
I teraz pytanie. Czy jesli wskaznik na poczatek listy uzyje do ponownej allokacji pamieci, to czy nie zginie mi zawartosc tej wczesniejszej listy?? Tzn czy wywolujac kolejne malloc nie przydzieli mi pamieci zuzytej na wczesiejsza liste?? Czy pozniej bede mogl bez problemu znow przepisac wskaznik tmp na start i nie bedzie zmian w liscie poczatkowej?? POZDRO
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

[c] Pytanie teoretyczne o pamiec

Post autor: smiechowiec »

soku11 pisze:czy wywolujac kolejne malloc nie przydzieli mi pamieci zuzytej na wczesiejsza liste??
Nie, dopóki nie zwolnisz pamięci, obszar będzie oznaczony jako zajęty i kolejne alokacje będą przypisywane do wolnego obszaru.
soku11 pisze: Czy jesli wskaznik na poczatek listy uzyje do ponownej allokacji pamieci, to czy nie zginie mi zawartosc tej wczesniejszej listy
Jest to możliwe tzn możemy utracić dostęp do obszaru, same dane będą bezpieczne :) Jeżeli zmienna początek wskazuje na pierwszy element listy, to nie powinno się modyfikować jej wartości.

Przeanalizujmy Twój kod
// start - wskazuje na początek listy
struct lista *tmp=start; // wskaźnik tmp wskazuje na ten sam obszar co star
start=(struct lista*)malloc(sizeof(struct lista)); // zmienna start wskazuje teraz na nowy element
start->pole1=1; // przypisanie wartości do nowego dodanego elentu
...
tmp = start; // zmienna tmp przyjmuje teraz wartość na nowo dodany element więc jeżeli nie mamy gdzieś zapamiętanego wskaźnika na początek listy to straciliśmy do niego dostęp.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[c] Pytanie teoretyczne o pamiec

Post autor: soku11 »

Szczerze to wlasnie na twoja odpowiedz liczylem Tam mialo byc na koncu:

Kod: Zaznacz cały

start=tmp;
Czy wtedy bede mial znow dostep do pierwotnej listy?? POZDRO
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

[c] Pytanie teoretyczne o pamiec

Post autor: smiechowiec »

Moim zdaniem tak,
bo pod tmp podstawiłeś początek listy, więc możesz przywrócić zmiennej start tą wartość.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[c] Pytanie teoretyczne o pamiec

Post autor: soku11 »

Ok. Tak sie chcialem tylko upewnic, zanim zaczne pisac bo kod ma juz prawie 1k linii kodu, wiec wole napisac raz a porzadnie Jeszcze raz dzieki!! POZDRO
ODPOWIEDZ