speicher malloc?
-
Hallo, ich hab mich im C++ forum vertan undsoll die Frgae hier noch aml posten:
mein Problem:
typedef struct na2 { char* name; int anz; } na2element im main: na2element einname[1024]; initialisierung: for (i = 0; i < 1024; i++) { einname[i].name = NULL; einname[i].anz = 0; } in einer while schleife gebe ich datein in das struct: while (bedingung) { // daten werden umständlicher gefüllt, deshalb hier nur ein Beispiel. aber auch dieses funktioniert nicht einname[i].name = "test"; einname[i].anz++; i++ // wenn ich hier ein cout mache, bekomm ich ein Ergebniss: printf("%5i %s\n",anz, name); } // wenn ich hier ein cout mache, bekomm ich KEIN Ergebniss: for(i=0;i<=1024;i++){ printf("%5i %s\n",einname[i].anz, einname[i].name); }
ANTWORT:
In dieser Zeile: einname[i].name = "test";
weist du dem Pointer einen Verweis auf einen temporären String zu. Wenn du den Gültigkeitsbereich verläßt, ist das Verhalten undefiniert bzw. Glück etc. Also entweder für name Speicher reservieren (zB mit new) oder gleich std::string benutzen.FRAGE:
jetzt weiss ich nicht, wie ich den speicher zuweisen soll?so funktioniert es leider nicht
na2element einname[1024]= (na2element) malloc(1024*(sizeof(na2element)));
-
Wie währs mit
na2element einnahmen[1024]; int i = 0; for( i = 0; 1024 > i; i++ ) strcpy( einnahmen[i].name, "test" );
oder du machst halt
na2element *einnahmen; einnahmen = malloc( 1024 * sizeof( na2element ) ); strcpy( einnahmen.name, "hey" );
-
Es gibt mehrere Möglichkeiten -- ok, bei so ziemlich allem gibt es nicht
die Lösung -- hier mal ein Vorschlag von mir:- wenn du weißt, dass deine Namen eine gewisse Größe nicht überschreiten,
kannst du ausreichend viel Speicher schon im struct definieren:
typedef struct na2 { char name[1024]; // <-- hier legst du nun Speicher für den Namen an! int anz; } na2element
@lippoliv: das hattest du in deinem Beispiel vergessen gehabt.
Die Verwendung ist dann ähnlich wie bei lippoliv:
strncpy( einnahmen[i].name, "test", 1024 );
2. Wenn du nun keine obere Grenze für die Länge der Namen kennst, oder
du Speicher sparen mußt, kannst du mit malloc ausreichend viel Speicher
anlegen.einnahmen[i].name = malloc((strlen("test")+1) * sizeof(char)); strncpy(einnahmen[i].name, "test", strlen("test"));
Hierbei kannst du den struct so belassen, wie du ihn ursprünglich hattest.
@lippoliv: ich glaube, dass beide deiner Vorschläge nicht funktioneren, da
du nur Speicher für die Struktur na2element anlegst, aber nicht für den
innerhalb der Struktur definierten String char* name.Gruß mcr
- wenn du weißt, dass deine Namen eine gewisse Größe nicht überschreiten,
-
for(i=0;i<=1024;i++){
muss
for(i=0;i<1024;i++){
heißen
-
Ich hatte übersehen dass er einen char Pointer benutzt...
Ich habe jetzt lediglich auf die Struktur geachtet...
Natürlich muss man dann noch den char Speicher reservieren, dass stimmt schon.
-
ich danke erst mal für eure Hilfe.
den Sinn von speicher hab ich nun verstanden, aber ich hab mir duch das ganze hin und her mal wieder nen anderen Fehler eingebaut...erst mla danke