Zum Inhalt springen

zeiger auf strukturen


hame

Empfohlene Beiträge

ich hab folgende struktur gegeben

#define LAENGE 80

typedef struct t_element{

	char inhalt[LAENGE];

	struct t_element *next;

}t_element;


typedef struct{

	struct t_element *erstesElement;

	struct t_element *letztesElement;

	int anzahlElemente;

}t_Listenkopf
jetzt hab ich zwei funktionen geschrieben die eine intialisiert den Listenkopf mit Null Werten und die andere fügt vorne ein neues Element ein.
void initListe(t_Listenkopf *li){


	li = malloc(sizeof(t_Listenkopf);

	li->erstesElement = NULL;

	li->letztesElement = NULL;

	li->anzahlElemente = NULL;


}


void vorneEinfuegen(t_Listenkopf *li, char *str){

	t_Listenkopf *neu;


	neu = malloc(sizeof(t_Element));

	if(neu==0){

		printf("malloc fehlgeschlagen");

			return -1;

	}

	neu->inhalt[LAENGE] = str;

	neu -> next = li -> erstesElement;


	if(!li -> erstesElement){

		li->letztesElement = neu;

		li->erstesElement = neu;

	}

}

jetzt wollt ich fragen ob das so grob stimmt weil ich noch nichts in die strukturen geschrieben habe und es noch nicht getestet habe.

mfg.

Bearbeitet von hame
Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Funktion initListe hat ein Problem: Parameter in C sind (bis auf Arrays) Call-by-Value, die Funktion arbeitet also immer mit Kopien der Parameter. In diesem Fall ist der Zeiger li also nur eine Kopie des Zeigers, mit dem du diese Funktion aufrufst. Die Änderungen in der Funktion, also das Zuweisen des mit malloc geholten Speichers, betreffen nur diese Kopie. Der Zeiger, der beim Aufruf angegeben wurde, ändert sich nicht.

Statt eines Parameters würde sich hier einfach ein Rückgabewert anbieten, denn mit dem reingegeben Zeiger machst du ja eigentlich gar nichts, du überschreibst ihn sofort.

In der Funktion vorneEinfuegen sind ein paar Fehler:

Du holst für neu Speicher für ein t_element, und benutzt es auch so, deklariert hast du es aber als Zeiger auf t_Listenkopf, das geht in die Hose.

Die Zuweisung des Inhalts ist auch falsch. Der Ausdruck inhalt[LAENGE] außerhalb der Deklaration bezieht sich auf ein einzelnes char-Element des Arrays, allerdings an einer Position, die genau hinter dem Ende des Arrays liegt, denn der letzte gültige Index wäre LAENGE-1.

Ganz allgemein kannst du Arrays nichts zuweisen. Zum Kopieren von Strings gibt es die Funktion strcpy, hier noch besser strncpy, damit du sicherstellen kannst, dass nicht mehr kopiert wird, als in inhalt hineinpasst (der gefürchtete Pufferüberlauf).

Zu guter Letzt muss die Zuweisung an li->erstesElement aus dem if-Block raus. Du musst immer den Anfangszeiger ändern, nicht nur dann, wenn die Liste vorher leer war.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Funktion initListe hat ein Problem: Parameter in C sind (bis auf Arrays) Call-by-Value, die Funktion arbeitet also immer mit Kopien der Parameter. In diesem Fall ist der Zeiger li also nur eine Kopie des Zeigers, mit dem du diese Funktion aufrufst. Die Änderungen in der Funktion, also das Zuweisen des mit malloc geholten Speichers, betreffen nur diese Kopie. Der Zeiger, der beim Aufruf angegeben wurde, ändert sich nicht.

Statt eines Parameters würde sich hier einfach ein Rückgabewert anbieten, denn mit dem reingegeben Zeiger machst du ja eigentlich gar nichts, du überschreibst ihn sofort.

ich glaub ich brauch da gar kein malloc, das lass ich mal gleich weg. aber ich glaub das andere ist soweit richtig ich soll ja nur den listenkopf mit nullern initialisieren.

der Funktion vorneEinfuegen sind ein paar Fehler:

Du holst für neu Speicher für ein t_element, und benutzt es auch so, deklariert hast du es aber als Zeiger auf t_Listenkopf, das geht in die Hose.

das hab ich auch gerade gemerkt und hab es verbessert ^^

Die Zuweisung des Inhalts ist auch falsch. Der Ausdruck inhalt[LAENGE] außerhalb der Deklaration bezieht sich auf ein einzelnes char-Element des Arrays, allerdings an einer Position, die genau hinter dem Ende des Arrays liegt, denn der letzte gültige Index wäre LAENGE-1.

Ganz allgemein kannst du Arrays nichts zuweisen. Zum Kopieren von Strings gibt es die Funktion strcpy, hier noch besser strncpy, damit du sicherstellen kannst, dass nicht mehr kopiert wird, als in inhalt hineinpasst (der gefürchtete Pufferüberlauf).

Zu guter Letzt muss die Zuweisung an li->erstesElement aus dem if-Block raus. Du musst immer den Anfangszeiger ändern, nicht nur dann, wenn die Liste vorher leer war.

aber sonst passt alles oder?

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich hab mir hat vorher eine header angelegt mit den funktionsdeklarationen und strukturdeklarationen und danach schreib ich mir eine testeliste.c und schreib in der mein() einen listenkopf und schreib was in die struktur und teste es. aber ich hab halt hier noch ein paar probleme wie man sieht ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...