Strona 1 z 1

[C] Sprawdzenie inicjalizacji stosu

: 21 paź 2017, o 15:13
autor: Chungu
Witam.

Piszę sobie implementację stosu w C i napotkałem pewien problem (możliwe, że chcę zbyt "dobrze" zabezpieczyć mój program). Otóż mam stos przechowujący liczby typu int w formie dynamicznej tablicy oraz "konstruktor" jako funkcję init, która owy stos inicjalizuje. Jest to mniej więcej coś takiego:

Kod: Zaznacz cały

 
struct Stack{
	int*data;
	long size;		
	long top;		
};
void init(struct Stack*s){
//.....
}
Zacząłem się zastanawiać czy istnieje jakaś możliwość na poprawne zareagowanie na np. niepotrzebna ponowna inicjalizacje czyli coś takiego:

Kod: Zaznacz cały

int main(){
struct Stack stack;
init(&stack);
init(&stack); //nadmiarowa inicjalizacja - blad
}
Chciałbym również sprawdzać czy w funkcjach takich jak push, pop obiekt został poprawnie zainicjalizowany... stąd moje pytanie... Problem polega na tym, że w C ( z tego co mi wiadomo) nie ma czegoś takiego jak inicjalizacja wskaźnika pewną wartością domyślną (chociaż Nullem)...
Dzięki za pomoc.

Re: [C] Sprawdzenie inicjalizacji stosu

: 21 paź 2017, o 17:38
autor: Afish
Musiałbyś sprawdzić, czy wszystkie pola stosu mają wartości uważane za sensowne.
Wskaźnik jako zmienna lokalna nie jest inicjalizowany, w innych przypadkach jest nullem.

Re: [C] Sprawdzenie inicjalizacji stosu

: 21 paź 2017, o 18:13
autor: bartek118
Wypadałoby też w danym elemencie stosu mieć wskaźnik na kolejny element.

Re: [C] Sprawdzenie inicjalizacji stosu

: 22 paź 2017, o 15:50
autor: Chungu
Dzięki, czyli podsumowując, nie da się tego zrobić?

Re: [C] Sprawdzenie inicjalizacji stosu

: 22 paź 2017, o 20:25
autor: Afish
Dać się da z dokładnością do tego, że jeżeli ktoś będzie chciał, to i tak to obejdzie. Najprościej jest sprawdzać, czy stos znajduje się w dobrym obszarze pamięci (czy masz pozwolenie na odczyt stron pamięci) i potem weryfikować sensowność wartości, ale jak komuś będzie zależało, to i tak ręcznie podmieni co trzeba i zainicjalizuje drugi raz. Nie ma co przesadnie kombinować, jakaś prosta heurystyka wystarczy w większości przypadków.