大小 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));
chromosome
是 struct chromosome *
类型,根据 valgrind 是 8 个字节。但是结构体是struct chromosome
类型的,比较大。
为结构分配 space,而不是指向它的指针:
chromosome = malloc(sizeof(*chromosome));
或:
chromosome = malloc(sizeof(struct chromosome));
我有这样的结构
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));
chromosome
是 struct chromosome *
类型,根据 valgrind 是 8 个字节。但是结构体是struct chromosome
类型的,比较大。
为结构分配 space,而不是指向它的指针:
chromosome = malloc(sizeof(*chromosome));
或:
chromosome = malloc(sizeof(struct chromosome));