Array in einer Struktur
-
Hallo,
ich versuche vergeblich mit dem Array einer Struktur zu arbeiten. Dabei werden mir die Werte in der Struktur immer wieder beim Benutzen einer ANDEREN Variable überschrieben. Ich habe mir schon die Speicheradressen der Pointer ausgeben lassen. Daran sollte es nicht liegen.
Also grob skizziert läuft das ganze so ab:
/* Auszug aus den Strukturen */ struct xtr_get_write_struct { char *xtrs_str[6]; } xtr_get_write_structx; struct xtr_channame_struct { struct xtr_get_write_struct name[5]; } channame; struct xtr__main_struct { struct xtr_channame_struct channame; } xtr, *pxtr; char *xtrs[6]; pxtr = &xtr; ... /* Hier wird in einer Schleife xtrs immer wieder neu besetzt und eine Kopie in die Struktur abgezweigt. */ for (i=0;i<k;i++) { ... funktion_XY(arg1,arg2,arg3,xtrs); *xtr.channame.name[i].xtrs_str = *xtrs; ... }
Theoretisch erwarte ich, dass ich in den verschiedenen "i"s meine strings des jeweiligen Durchlaufs habe. Also, z.B.
xtr.channame.name[0].xtrs_str enthält "UZ"
xtr.channame.name[1].xtrs_str enthält "KX"ABER jetzt kommt's:
In dem Moment, in dem "xtrs" im 2. Durchlauf mit dem Wert "KX" besetzt werden soll, steht dieser ebenso in "xtr.channame.name[0].xtrs_str". "xtrs" und "xtr.channame.name[0].xtrs_str" haben unterschiedliche Speicheradressen. Irgendwie scheinen die beiden verheiratet zu sein. Selbst, wenn ich über eine temporäre Zwischenvariable gehe, ändert das Neubesetzen der "Mehrweg"variable "xtrs" gleichzeitig den Wert von "xtr.channame.name[0].xtrs_str".Kann es an
pxtr = &xtr;
oder der Initalisierung von
struct xtr__main_struct { struct xtr_channame_struct channame; } xtr, *pxtr;
liegen?
Hat jemand eine Idee?
-
http://www.galileocomputing.de/openbook/c_von_a_bis_z/c_017_005.htm#RxxobKap017005040029AC1F03F18C
Schau dir mal das an, ich glaube, dass ist das wonach du suchst
-
Hallo Danke für den Link. Wirklich sehr gutes Onlinebuch.
Ich habe jetzt herraus gefunden, dass es an meiner Zuweisung von lokaler Variable in die Struktur liegen muss. Ich kann die Struktur manuell ohne Probleme besetzen aber, wenn ich den Inhalt des Char-Pointer in die Struktur kopiere, wird das nichts. Auch ohne Array. Jedes Befüllen meiner lokalen Variable xtrs mit neuen Werten ändert alle Werte in der Struktur, die je mit der lokalen Variable xtrs gleich gesetzt worden sind.
Darf ich nicht einfach
*xtr.behaelter.gefaess.xtrs_str = *xtrs;
benutzen?
Muss ich meine Struktur anders aufbauen?
-
Ja, mußt du - deine Struktur enthält ein Array von char-Pointern, die wiederum auf dein globales Array verweisen. Du solltest dir mal Gedanken über dynamische Speicherverwaltung machen (sprich: du legst den Speicher per malloc() an und kopierst dann die Daten per strcpy() dor rein).
-
Hmmm. Ja, ich glaube das mit den Pointern auf chars ist u.a. mein Problem. Kapier ich nicht. Da die ja selbst wiederum Pointer sind.
Ist die Zuweisungn per "=" also in meinem Fall also das Problem? strcpy hab ich auch schon probiert. Aber da genau das gleich Problem: Ein Ändern von xtrs änder immer alle Strukturelemente, die vorher mal mit "=" gleich gesetzt wurden.
Wie kann ich nur den Inhalt des Pointers kopieren? Ich dachte, wenn die "Level of indirection" übereinstimmen ist das mit "=" erlaubt.
-
Du mußt IMMER deine Daten mit strcpy() kopieren. "tgt=src;" verbiegt den Zeiger tgt nur, so daß er anschließend auf den selben Speicherbereich zeigt wie src (mit dem bekannten Ergebnis, daß sich Änderungen wechselweise auswirken). strcpy(tgt,src) schreibt dagegen den Inhalt hinter src in den Speicherbereich, den tgt für sich reserviert hat - und das ist das, was du erreichen willst.
(PS: Wenn möglich, steig um auf C++ - die std::string ist wesentlich einfacher zu handhaben als C's char-Arrays)
-
Danke!
Ich kann leider nicht auf C++ ausweichen.
Wie mach ich es, wenn ich ints, floats und doubles in meine Struktur kopieren will ohne die Pointer zu verbiegen? Gib es da dann auch sowas wie strcpy?
-
Elementare Datentypen kannst du ganz normal per = kopieren - nur Zeiger machen da etwas Probleme (such mal nach "flache Kopie" / "tiefe Kopie", um dir die Unterschiede erklären zu lassen).
-
Vielen Dank für Eure Hilfe!
Ich hatte letztendlich an anderer Stelle die Pointer auf andere Pointer "verbogen".