2016-06-24 3 views
2

Ich habe eine Struktur wie dieseUngültige Schreib der Größe 8 valgrind auch für NULL Zuordnung

struct chromosome 
{ 
    float fitness;           /** Fitness of the chromosome. i.e Value calucated by 
                      fitness function */ 
    char *genes;           /** Genes of the chromosome */ 

    struct meta_chromosome *meta_chromosome;    /** Pointer to the meta_chromosome structure */ 
}; 

Ich versuche, eine Instanz der Struktur zu schaffen, wie diese

/* 
* Allocates memory fore the chromosome and related objects 
*/ 
struct chromosome * 
create_chromosome(struct meta_chromosome *meta_chromosome) 
{ 
    struct chromosome *chromosome = NULL; 
    chromosome = malloc(sizeof(chromosome)); 


    chromosome->genes = NULL; 
    chromosome->genes = malloc((meta_chromosome->len + 1) * sizeof(char)); 

    chromosome->meta_chromosome = meta_chromosome; 

    return chromosome; 
} 

Aber wenn ich es bin kompilieren und laufen valgrind ich erhalte diesen Fehler

Invalid write of size 8 
==3584== at 0x400856: create_chromosome (chromosome.c:54) 
==3584== by 0x4008A5: gen_random_chromosome (chromosome.c:68) 
==3584== by 0x400FA0: init_rand_population (genetic_algorithm.c:177) 
==3584== by 0x40115E: main (main.c:47) 
==3584== Address 0x52021a8 is 0 bytes after a block of size 8 alloc'd 
==3584== at 0x4C2BBCF: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 

Was das Problem sein könnte

+0

Benennen Sie Ihre Instanzvariable nicht mit dem Namen Ihrer Struktur, dies maskiert den Fehler, wo Sie die Größe des Zeigers malloc sind, nicht die Größe der Struktur – KevinDTimm

+0

Es besteht keine Notwendigkeit Wirf 'NULL' nach' char * '. – ameyCU

+2

Es wäre schön, wenn Sie uns sagen würden, welcher Zeile 54 tatsächlich entspricht. Vielleicht möchten Sie dies in der Zukunft lesen, um Ihr Problem zu reproduzieren, müssten wir unser eigenes Programm schreiben: https://stackoverflow.com/help/mcve – Taywee

Antwort

7

Du Zuteilung nicht genug Platz:

chromosome = malloc(sizeof(chromosome)); 

chromosome ist vom Typ struct chromosome *, die nach valgrind 8 Byte. Aber die Struktur ist vom Typ struct chromosome, die größer ist.

Weisen Raum für den struct, nicht ein Zeiger darauf:

chromosome = malloc(sizeof(*chromosome)); 

Oder:

chromosome = malloc(sizeof(struct chromosome)); 
+0

Autsch, ich habe es in einem Wimpernschlag verpasst –

+0

@Goutam Es gibt zwei Arten von Programmierern: diejenigen, die genau solche Fehler gemacht haben, und Lügner. ;-) –

3
chromosome = malloc(sizeof(chromosome)); 

chromosome ein Zeiger auf struct chromosome ist, daher über malloc gleiche Speicher zuordnen werden die Größe des Zeigers - nicht für die Struktur. Sie müssen es anders herum tun, genügend Bytes zuweisen, um das Strukturobjekt und nicht den Zeiger zu halten. Verwenden Sie zum Beispiel struct chromosome in sizeof.

+0

Oder 'struct Chromosom * Chromosom = malloc (sizeof (* Chromosom));' –

+0

@JonathanLeffler Ja, richtig –