大小 8 valgrind 的无效写入,即使是 NULL 分配

Invalid write of size 8 valgrind even for NULL assignment

我有这样的结构

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 */
};

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

/*
 * 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;
}

但是当我编译它并且 运行 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)

可能是什么问题

你分配的不够space:

chromosome = malloc(sizeof(chromosome));

chromosomestruct chromosome * 类型,根据 valgrind 是 8 个字节。但是结构体是struct chromosome类型的,比较大。

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

chromosome = malloc(sizeof(*chromosome));

或:

chromosome = malloc(sizeof(struct chromosome));