Probleme bei Struktur mit variabler Stringlänge

Azero

Mitglied
Hallo..

Ich hab hier ein Problem, welches sich einfach nicht lösen lassen will. Ich versuche ein Array vom Typ einer eigenen Struktur zu basteln. Schwierig dabei ist, das die Struktur aus 2 Variablen vom Typ char * besteht. Mir stellt sich jetzt die Frage, wie ich jetzt effizient Speicher für das Array als auch die beiden Strings in der Struktur allociere Ich versuch das mal in code auszudrücken.

struct parameterValStr{
char *name;
char *value;
};

main{
struct parameterValStr *pvs;

//Array vom typ pvs mit 2 elementen

pvs=(parameterValStr *)malloc(sizeof(parameterValStr)*2);
pvs[0].name=(char *)malloc(sizeof(char)*32);
pvs[0].value=(char *)malloc(sizeof(char)*32);
pvs[1].name=(char *)malloc(sizeof(char)*32);
pvs[1].value=(char *)malloc(sizeof(char)*32);

//füllen auslesen..

free(pvs);

}

So wie ich es geschrieben habe, funktioniert es nicht wirklich, aber ich hoffe die Idee dahinter ist ersichtlich geworden? Kann mir jemand sagen, wie man das richtig umsetzt?

Danke fürs lesen..
Gruß Azero
 
Zuletzt bearbeitet:
So, wie ich das sehe, funktioniert das durchaus. Das einzige, was noch fehlt, ist die Freigabe der 4 allokierten Strings in Deinem Array. pvs ist ein Zeiger auf einen Speicherbereich, der 2 structs enthält, von denen jedes 2 Zeiger enthält, und eben nicht mehr als die Zeiger. Der allokierte Speicher ist also 16 Byte groß (4 Byte pro Zeiger). Die Strings, die Du mit malloc allokierst, liegen woanders im Speicher (jeweils 32 Byte groß), die Struct-Elemente zeigen darauf. Soweit ist an Deinem Code alles richtig.
Nur beim Aufräumen mußt Du erst die Speicherbereiche der Strings wieder mit free(...) freigeben, bevor Du den Speicher von pvs freigibst:
Code:
free(pvs[0].name);
 free(pvs[0].value);
 free(pvs[1].name);
 free(pvs[1].value);
 free(pvs);
 
Dem ist eigentlich nur noch hinzuzufügen, arbeitest du mit C++?
Dann könntest du dir den ganzen Humbug ersparen und std::string benutzen. Dann brauchst du (fast) nicht rum-free-en oder mallocen:

Code:
#include <string>

struct parameterValStr
{
  std::string    name;
  std::string    value;
};

parameterValStr*   pvs = new parameterValStr[2];

pvs[0]->name = "Wullewatz";
pvs[0]->value = "der Grosse";
pvs[1]->name = "Hurz";
pvs[1]->value = "Der Wolf! Das Lamm!";

delete[] pvs;

Die Strings räumen selbst hinter sich auf. Gibt höchstens dann Ärger, wenn du die Structs mit fread oder fwrite in einem Stück lesen/schreiben willst.
 
Hallo..

Danke euch für die vielen Beiträge. Ja es muss ANSI-C sein, das das binary auf einem microcontroler laufen soll. Hab auch alles gefunden und den Speicher lass ich auch wieder frei..

btw... super forum, nette leute

greetinX
Azero
 
Zurück