2017-12-27 8 views
0

So habe ich diese Funktion:malloc Fehler: Falsche Prüfsumme für befreites Objekt in struct für Datei zu lesen

source_t * source_init(char * argsource) 
{ 
    source_t * temp = (source_t *) malloc(sizeof(source_t *)); 
    temp->path = realpath(argsource, NULL); 
    temp->dir = dirname(temp->path); 
    temp->name = basename(temp->path); 
    temp->ext = strrchr(temp->name, '.'); 
    temp->content = read_file(temp->path); // here 
    temp->error = error_free(); 
    return temp; 
} 

Es ruft Funktion read_file():

char * read_file(char * sourcepath) 
{ 
    char * buffer = NULL; 
    long string_size, read_size; 
    FILE * file = fopen(sourcepath, "r"); 
    fseek(file, 0, SEEK_END); 
    string_size = ftell(file); 
    rewind(file); 
    buffer = (char *) malloc(sizeof(char) * (string_size + 1)); 
    read_size = fread(buffer, sizeof(char), string_size, file); 
    buffer[string_size] = '\0'; 
    if (string_size != read_size) 
    { 
     free(buffer); 
     buffer = NULL; 
    } 
    fclose(file); 
    return buffer; 
} 

und diese Fehler aufkommt : malloc: *** error for object 0x7faf08402698: incorrect checksum for freed object - object was probably modified after being freed. Also meine derzeitige Lösung ist es, content separat zu initialisieren, nachdem ich source_init() in der Hauptsache aufgerufen habe Funktion. Obwohl diese Lösung funktioniert, möchte ich content in source_init() initialisiert werden. Auch scheint es, ich kann source_init() nicht direkt anrufen, um content zu initialisieren, weil der gleiche Fehler auftaucht, so muss ich einen Puffer erstellen, um source_init() aufzurufen und content zu initialisieren, um zu puffern.

Antwort

5

Dies ist wahrscheinlich nicht das, was Sie tun möchten:

source_t * temp = (source_t *) malloc(sizeof(source_t *)); 

, dass der Raum für einen Zeiger zu einem source_t Objekt, noch für eine source_t Objekt zuordnet.

Auch in C sollten Sie nicht den Rückgabewert von malloc werfen. Dies kann Fehler verbergen und sie sehr schwer finden.

+5

Ein weiterer Grund neben der Wartbarkeit, die Form 'source_t * temp = malloc (sizeof (* temp)) zu verwenden;' –

-1

In source_init() in der malloc() Zeile haben Sie einen Fehler.

es sein sollte: source_t * temp = (source_t *) malloc(sizeof(source_t));

und nicht: source_t * temp = (source_t *) malloc(sizeof(source_t *));

+0

Sie sagten "zuerst" ... gibt es ein zweites Problem, das Sie sehen? –

2

auf Thomas' answer Ausbau

  1. nicht malloc werfen Sie, calloc oder realloc. Das maskiert nur mögliche Fehler.
  2. Wenn möglich, verwenden Sie sizeof(<data type>) nicht bei der Berechnung der Größe. Es ist einfach, Fehler zu machen und macht eine erneute Faktorisierung Ihres Codes zu einem Schmerz im ****.

verwenden stattdessen

source_t *temp = malloc(sizeof *temp); 

Dies hat den Vorteil, dass sizeof *temp gibt genau die richtige Anzahl von Bytes, die Sie nicht über die richtige Art zu denken (wie wenn man mit Doppel/Dreifach beschäftigen Zeiger) und wenn Sie den Datentyp ändern müssen, sagen wir zu source2_t, dann müssen Sie nur den Typ der Variablen ändern, ohne sich Gedanken über nervtötende sizeof(<data type>), die leicht übersehen werden können.