我有这样的结构
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)
可能是什么问题
你没有分配足够的空间:
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)