struct, malloc, free
-
Hallo,
in folgenden Code-Zeilen sollen für data speicher allokiert werden, Struktur aufgefüllt werden und nachdem diese in eine Datei geschrieben wurden, der Speicher freigegeben werden. Ich habe hier 2 Probleme:
- Die Daten (hier "1234") werden nicht in test.data reingeschrieben
- in free(test.data) kommt zu crash.
Was mache ich falsch?
Für die Hilfe wäre ich sehr dankbar.Grüße
Bahanfartypedef struct test_header
{
void *data;
}test;test.data = (void *)malloc(sizeof(char)*5);
memcpy(test.data,"1234",5);
free(test.data);
-
Eigentlich sollte das garnicht durch den Compiler gehen, da test ein Typ ist, und man nicht auf die Daten eines Typs zugreifen kann (genauergesagt hat der Typ garkeine Daten). Legst Du irgendwo eine Instanz von test an?
Achja:
1. Bitte benutze CPP-Tags.
2. malloc brauchst Du nicht casten
3. sizeof(char) ist per Definition 1typedef struct test_header { void *data; } test; test instanz; instanz.data = malloc(5);
-
LordJaxom schrieb:
Eigentlich sollte das garnicht durch den Compiler gehen, da test ein Typ ist, und man nicht auf die Daten eines Typs zugreifen kann (genauergesagt hat der Typ garkeine Daten). Legst Du irgendwo eine Instanz von test an?
Achja:
1. Bitte benutze CPP-Tags.
2. malloc brauchst Du nicht casten
3. sizeof(char) ist per Definition 1typedef struct test_header { void *data; } test; test instanz; instanz.data = malloc(5);
Hallo,
eine Instanz legen ich nicht an, weil diese eine geschachtelte Struktur ist:typedef struct HEADER
{
int msb;
struct
{
void *data;
}test;
}HEADER;Ich gehe also genauer gesagt so vor:
HEADER header;1. header.test.data = malloc(5);
2. memcpy(header.test.data,"1234",sizeof(header.test.data));
3. free(header.test.data);Es klappt weder so, noch als nicht geschachtelte Struktur mit instanz.
Grüße
Bahanfar
-
Das klappt bei mir hervorragend. Zeig doch mal ein Minimalbeispiel, das den Fehler auch reproduziert.
-
sizeof(header.test.data) gibt dir aber nicht die allokierte Größe zurück, das weißt du, oder?
-
MFK schrieb:
Das klappt bei mir hervorragend. Zeig doch mal ein Minimalbeispiel, das den Fehler auch reproduziert.
Hallo,
hier das Mini-Beispiel. Hier bekomme ich kein Crash bei free, aber mit memcpy() kann ich nichts in header.test.data rein schreiben.
Warum liefert mir sizeof(header.test.data) nicht die vorher allockierte Speichergröße?Danke und Gruß
Bahanfar#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <conio.h>
#include <string.h>typedef struct HEADER
{
int msb;
struct
{
void *data;
}test;
}HEADER;void writeInFile(FILE *file,HEADER *data)
{
size_t x;
x = fwrite(data,sizeof(HEADER),1 , file);
printf("Schreiben = %d",x);
}
void readOutFile(FILE *file)
{
HEADER test;
fseek(file,0L,SEEK_SET);
fread(&test, sizeof(HEADER), 1, file);
}int main(void)
{
HEADER header;
char *filename;
FILE *dat_file = NULL;filename = "H:\\data.dat";
if((dat_file = fopen(filename, "w+")) == NULL) {
return 0;
}
header.msb = 1;
header.test.data = malloc(5);
memcpy((header.test.data),"1234",5);
writeInFile(dat_file,&header);
free(header.test.data);
readOutFile(dat_file);
fclose(dat_file);
return 1;
}
-
[cpp]-Tags benutzten
-
bahanfar schrieb:
Hier bekomme ich kein Crash bei free, aber mit memcpy() kann ich nichts in header.test.data rein schreiben.
Woraus schließt du das denn? Weil hinterher nicht 1234 in der Datei steht? Das kann nicht funktionieren, weil in HEADER nur ein Zeiger auf diese Daten steht. Den schreibst du in die Datei.
bahanfar schrieb:
Warum liefert mir sizeof(header.test.data) nicht die vorher allockierte Speichergröße?
Weil das nicht Sinn und Zweck von sizeof ist.
-
MFK schrieb:
bahanfar schrieb:
Warum liefert mir sizeof(header.test.data) nicht die vorher allockierte Speichergröße?
Weil das nicht Sinn und Zweck von sizeof ist.
Und vor allem weil sizeof bereits zur Compilezeit ausgewertet wird - also lange bevor herauskommt, wieviel Platz du überhaupt anfordern willst.
-
MFK schrieb:
bahanfar schrieb:
Hier bekomme ich kein Crash bei free, aber mit memcpy() kann ich nichts in header.test.data rein schreiben.
Woraus schließt du das denn? Weil hinterher nicht 1234 in der Datei steht? Das kann nicht funktionieren, weil in HEADER nur ein Zeiger auf diese Daten steht. Den schreibst du in die Datei.
bahanfar schrieb:
Warum liefert mir sizeof(header.test.data) nicht die vorher allockierte Speichergröße?
Weil das nicht Sinn und Zweck von sizeof ist.
und wie muss ich machen, dass es funktioniert? Später muss ich diese aus der Datei lesen. Liege ich mit fread richtig?
Sorry für diese nervende Anfängerfragen.Danke
-
fread() und fwrite() sind schon richtig - allerdings mußt du nicht die struct mit dem Pointer schreiben, sondern die Daten, die hinter dem Pointer liegen;
struct test { size_t datasize;//es ist immer gut zu wissen, wie groß die Nutzdaten sind void* data; } void write_test(FILE* datei,test* obj) { fwrite(&(obj->datasize),sizeof(size_t),1,datei); //Datengröße - 1 size_t fwrite(obj->data,1,obj->datasize,datei); //Nutzdaten - datasize Byte } void read_test(FILE* datei,test* obj) { fread(&(obj->datasize),sizeof(size_t),1,datei); //Datengröße obj->data = malloc(obj->datasize); fread(obj->data,1,obj->datasize,datei); //Nutzdaten }