void in struct casten

ehmkey

Grünschnabel
Hallo, ich habe mehrere structs und will diese in eine Liste speichern.

ich hab in meiner struct liste einen Daten Teil der einfach ein void *ptr ist.

Wenn ich dann die liste ausgeben will und den pointer wieder in ein struct casten will, bekomm ich bei Visual Studio c++, Zugriffsverletzung beim Lesen.

Code:
struct line *test = (struct line *) malloc(sizeof(lineTyp));
test = (struct line*)temp->inhalt;



Ich hoffe die Info reicht für eine Hilfe, danke.
 
Hi.
ich hab in meiner struct liste einen Daten Teil der einfach ein void *ptr ist.

Wenn ich dann die liste ausgeben will und den pointer wieder in ein struct casten will, bekomm ich bei Visual Studio c++, Zugriffsverletzung beim Lesen.

Code:
struct line *test = (struct line *) malloc(sizeof(lineTyp));
test = (struct line*)temp->inhalt;



Ich hoffe die Info reicht für eine Hilfe, danke.
Nein, tut es nicht. Bitte verwende die Code Tags und mach mal ein vollständiges Beispiel mit den Strukturen und wie die die Struktur füllst.

Gruß
 
Danke für die Antwort.

Ich habe 5 structs (linie, Kreis, Rechteck,...) mit verschiedenen Eigenschaften.

Die befülle ich in verschiedenen Funktionen und übergebe es so an die Funktion zum einfügen in die Liste:

Code:
insert_list(&tmp_line,1);

so sieht das struct der liste aus
Code:
typedef struct liste
{
	struct liste *next;
	struct liste *last;
	int head;
	int shape;
	void *inhalt;
}	listenTyp;

in void *inhalt speicher ich die structs:

Code:
void insert_list(void *daten, int shape)
{if(shape==1) //Linie
        {
			//temp->inhalt = malloc(sizeof(temp->inhalt));
		    //temp->inhalt = (struct line*) malloc(sizeof(lineTyp));
			start->inhalt = daten;
			start->shape = 1;
			start->next = NULL;
......


jetzt zur ausgabe der liste:

Code:
temp = start;
	// Erstes Element ausgeben

	if((temp->shape)==1)
	{
		struct line *test = (struct line *) malloc(sizeof(lineTyp));
		test = (struct line*)temp->inhalt;

		printf("\nid: %s  \n",test->id);  //Hier entsteht der Fehler
		printf("x1: %d  \n",test->x1);
		printf("x2: %d  \n",test->x2);
		printf("y1: %d  \n",test->y1);
		printf("y2: %d  \n",test->y2);
		printf("---------------------------------------\n");
	}
 
Code:
struct line *test = (struct line *) malloc(sizeof(lineTyp));
		test = (struct line*)temp->inhalt;
Hier hast du ein Speicher-Leck produziert. Du allokierst Speicher für eine neue lineTyp Struktur und überschreibst gleich darauf die Adresse.

Allerdings reicht der Code immer noch nicht. Evtl. hast du die Liste nicht richtig zusammengebaut oder du überschreibst irgendwo etwas, oder hast irgendwo Speicher freigegeben der noch verwendet war. Mach mal ein Minimalbeispiel was man auch kompilieren kann.

Gruß
 
ok, das hab ich gemacht, trotzdem geht das nicht.

Ich hab das mal mitn debugger durchlaufen lassen und wenn ich dann die adresse dem struct übergebe steht nur blödsinn drin bzw. nicht das was drin stehen sollte.
 
Tja dann ist die Frage was vorgeht ... operator-> oder cast-operator ;)
Die Member-Operatoren haben eine höhere Priorität als der Cast.

@ehmkey: Der Code hat durch die Änderung an der Stelle kein Speicherleck mehr, aber der Fehler ist natürlich immer noch da.
ehmkey hat gesagt.:
C:
insert_list(&tmp_line,1)
Wie es aussieht übergibst du dort die Adresse einer lokalen Variablen (oder die Adresse eines Zeigers). Beides wäre natürlich Unsinn und kann so nicht funktionieren. Zeig deinen Code wenn du allein nicht klar kommst...

Gruß
 
Zurück