即使对于NULL赋值,也无效写入大小为8的valgrind

2 c valgrind

我有这样的结构

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 */
};
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一个这样的结构实例

/*
 * 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;
}
Run Code Online (Sandbox Code Playgroud)

但是当我编译它并运行valgrind时,我得到了这个错误

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)
Run Code Online (Sandbox Code Playgroud)

可能是什么问题

dbu*_*ush 8

你没有分配足够的空间:

chromosome = malloc(sizeof(chromosome));
Run Code Online (Sandbox Code Playgroud)

chromosome是类型struct chromosome *,根据valgrind是8字节.但结构是类型struct chromosome,更大.

为结构分配空间,而不是指向它的指针:

chromosome = malloc(sizeof(*chromosome));
Run Code Online (Sandbox Code Playgroud)

要么:

chromosome = malloc(sizeof(struct chromosome));
Run Code Online (Sandbox Code Playgroud)