2016-05-06 5 views
1

Speichern Ich habe folgende Struktur:Malloc Array von Strukturen, Daten in den Feldern nicht richtig

struct message { 
    int id; 
    int ack; 
    int data_len; 
    char *data; 
    time_t timer; 
} *messages, *temp; 

Ich bin ein Teil des Speichers Zuteilung bisnumMessages Menge dieser structs zu halten:

messages = malloc(sizeof(messages)*numMessages); 

Und dann n Nachrichten können durch den Aufruf der Funktion Readfromfile (int), mit Zählung auf 0

initialisiert hinzugefügt werden
void readFromFile(int n) { 

    char input_buff[4096]; 
    int size = sizeof(struct message); 
    for (int i = 0; i < n; i++) { 
     bzero(input_buff, sizeof(input_buff)); 
     int nread = fread(input_buff, 1 , msgSize, fp); 

     if (nread > 0) { 
      printf("adding message: %d\n", count); 

      temp = (struct message *) malloc (sizeof (struct message)); 
      temp->data_len = nread; 
      temp->id = count; // set integer id 
      temp->data = malloc(sizeof(char) * (nread)); 
      temp->ack = 0; 

      memcpy(temp->data, input_buff, nread); 
      memcpy(&messages[count],temp,sizeof(temp)); 

      count++; 
      free(temp); 

     } 

     if (nread < sizeof(input_buff)) { 
      if (feof(fp)) 
      printf("End of file\n"); 
      free(filename); 
      close(fp); 
      break; 
     } 

     if (ferror(fp)) { 
      printf("Error reading\n"); 
      break; 
     } 
    } 
} 

JEDOCH, messages [count] .data wird nicht gespeichert. Wenn jedoch tauschen ich die Zeilen:

temp->data_len = nread; 

und

temp->data = malloc(sizeof(char) * (nread)); 

Die Daten richtig gespeichert ist, aber jetzt DATA_LEN nicht gespeichert? Was mache ich falsch? Abgesehen davon, dass ich sicher bin, dass ein Zeiger temp und dann die Bewältigung des Speichers redundant ist ...

Vielen Dank!

+0

[Sie das Ergebnis von malloc nicht gegossen] (http://stackoverflow.com/ questions/605845/do-i-cast-das-ergebnis-von-malloc) – Barmar

+0

'memcpy (& messages [count], temp, sizeof (temp));' sollte auch 'sizeof (* temp)' – immibis

+0

sein "Ich habe die folgende Struktur: "- Nein! Sie haben Zeiger auf diese "struct" – Olaf

Antwort

2

messages ist ein Zeiger auf struct message, seine Größe wie die Struktur nicht das gleiche ist, dies ändern:

messages = malloc(sizeof(struct message) * numMessages); 
+0

Vielen Dank! Es wird jedoch immer noch nicht richtig gespeichert. Wenn ich einige Druckanweisungen hinzufüge bekomme ich: Nachricht hinzufügen: 0, data_len: 0, nread 4096, Gespeicherte Daten: (null), Gespeichert data_len: 0, Nachricht hinzufügen: 1, data_len: 0, nread 4096, Gespeicherte Daten: (null), Gespeichert data_len: 0, Nachricht hinzufügen: 2, data_len: 53, nread 2048, Gespeicherte Daten: (null), Gespeichert data_len: 53, Ende der Datei – mdibound

+0

@mdibound Was ist das erwartete Verhalten? – fluter

+0

Jede Struktur sollte die Daten, die vom Datenträger gelesen werden, in input_buffer speichern und den Wert nread als data_len speichern, so dass messages [0] .data den ersten gelesenen Block aus der Datei und messages [0] .data_len = die Nummer enthält Bytes lesen ... aber keiner von beiden wird gespeichert. – mdibound