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

C 即使对于空赋值,大小为8的写入也无效,c,valgrind,C,Valgrind,我有一个这样的结构 struct chromosome { float fitness; /** Fitness of the chromosome. i.e Value calucated by fitness function */ char

我有一个这样的结构

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;
}
我试图创建一个这样的结构实例

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)

可能是什么问题

您没有分配足够的空间:

chromosome = malloc(sizeof(chromosome));
染色体
属于
struct染色体*
类型,根据valgrind,该类型为8字节。但是这个结构是
struct染色体类型
,它更大

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

chromosome = malloc(sizeof(*chromosome));
或:


不要将实例变量命名为与结构名称相同的名称,这是在掩盖错误,即您正在
malloc
指定指针的大小,而不是结构的大小。无需将
NULL
强制转换为
char*
。如果您告诉我们第54行实际对应的是什么,那就太好了。您可能希望以后阅读此内容,为了重现您的问题,我们需要编写自己的程序:在将
malloc()
的结果分配给同一指针之前,立即将指针设置为NULL是毫无意义的。您的编译器几乎肯定会对其进行优化,但您可能不应该编写它。您可以使用:
struct-chromose*chromose=malloc(sizeof(*chromose))或等效代码,然后检查作业是否有效。哎哟,我一眨眼就错过了eye@Goutam有两种类型的程序员:犯过类似错误的程序员和说谎者