[C & CodeBlosck 10.05 & Windows7] Crash przy alok. pamięci


(Przemekbaranowski) #1

Witam.

Napisałem taki kod :

#include 

#include 


struct stringi{

	char znak;

	struct stringi *next,*prev;

};


struct listholder{

struct stringi *first,*last;

}*tekst_jawny_H,*szyfrogram_H,*haslo_H;



int push(struct listholder *holder,char c){

	struct stringi* newPtr;

                                                            printf(".1");


	newPtr = (struct stringi*) malloc(sizeof(newPtr));

                                                            printf(".2");

	newPtr->znak = c;

                                                            printf(".3");

	newPtr->prev = holder->last;

                                                            printf(".4");

	newPtr->next = NULL;

                                                            printf(".5");


	if (holder->first==NULL)

		holder->first = newPtr;

                                                            printf(".6");


	if (holder->last != NULL)

		holder->last->next = newPtr;

                                                            printf(".7");


	holder->last = newPtr;

                                                            printf(".8 -> ");

	return 0;

}





char pop(struct listholder *holder){

	char tempDana;

	struct stringi* tempWsk;

                                                                printf("1");

	if (holder->first) {

                                                                printf("2");

		tempDana = holder->first->znak;

                                                                printf("3");

		tempWsk = holder->first->next;

                                                                printf("4");

		free(holder->first);

                                                                printf("5");

		holder->first = tempWsk;

                                                                printf("6 -> pobrano: ");

	} else {

		printf("Probujesz opro¿niæ ju¿ pust¹ listê!\n");

                                                                printf("7");

		tempDana = -1;

                                                                printf("8");

	}


	return tempDana;

}




int main()

{

char c;

tekst_jawny_H = (struct listholder*)malloc( sizeof( tekst_jawny_H ) );


c='a';

push(tekst_jawny_H,c);

printf("added a\n");

c='b';

push(tekst_jawny_H,c);

printf("added b\n");

c='c';

push(tekst_jawny_H,c);

printf("added c\n");


c=pop(tekst_jawny_H);

printf("%c\n",c);

c=pop(tekst_jawny_H);

printf("%c\n",c);

c=pop(tekst_jawny_H);

printf("%c\n",c);

    return 0;

}

W gruncie rzeczy jest to kolejka dwukierunkowa. Przy kompilacji nie ma żadnych problemów. Korzystam z Windows 7 x64. Aplikacja wysypuje się przy alokacji drugiego, czasem trzeciego elementu listy.

Wszystko jest ok, gdy uruchomię program w trybie zgodności z Windows XP SP3. Pod Ubuntu 10.10 (gcc) także działa bez problemu.

Jakieś pomysły? Będe bardzo wdzięczny za wszelka pomoc;)


(Spam) #2

Przy alokowaniu podajesz rozmiar wskaźnika, a nie rozmiar elementu, na który wskazuje.


(Przemekbaranowski) #3

To nie to. Nie ważne czy napiszę

newPtr = (struct stringi*) malloc(sizeof(newPtr));

czy

newPtr = (struct stringi*) malloc(sizeof(struct stringi));

w obu przypadkach ten sam błąd


(Spam) #4

Wewnątrz funkcji operujesz na lokalnej kopii wskaźnika, a nie na oryginalnym wskaźniku. Poza tym przydzielasz pamięć dla tekst_jawny_H, ale nie inicjujesz pól struktury – a potem przy dodawaniu nowego elementu sprawdzasz zawartość tych pól.

Jeśli ten kod ma generować listę dwukierunkową, to nie bardzo zmierza w tym kierunku :stuck_out_tongue:


([alex]) #5

Już podawałeś swój kod w poprzednim poście, ja ci poradziłem:

void push(struct listholder *holder,char c)