使用valgrind读取这个我得到:无效的写入/读取大小4
struct Person{
char* name;
int age;
};
struct Person* create_person(char *name, int age)
{
struct Person* me = (struct Person*)malloc(sizeof(struct Person*));
assert(me!= NULL); //make sure that the statement is not null
me->name = name;
me->age = age;
return me;
}
使用valgrind
获取干净的日志struct Person{
char* name;
int age;
};
struct Person* create_person(char *name, int age)
{
struct Person* me = (struct Person*)malloc(sizeof(struct Person*)+4);
assert(me!= NULL); //make sure that the statement is not null
me->name = name;
me->age = age;
return me;
}
为什么我应该明确地sizeof(struct+intSize)
来避免这个错误? sizeof
没有获得结构的整个大小?
答案 0 :(得分:5)
您在malloc
的调用中使用了错误的尺寸。
struct Person* me = (struct Person*)malloc(sizeof(struct Person*));
^^^^^^^^^^^^^^^
这是指针的大小,而不是对象的大小。你需要使用:
struct Person* me = (struct Person*)malloc(sizeof(struct Person));
为了避免这样的错误,请使用以下模式,不要转换malloc
的返回值(请参阅Do I cast the result of malloc?):
struct Person* me = malloc(sizeof(*me));
malloc(sizeof(struct Person*)+4)
的作用很巧合。您的struct
有一个指针和int
。您平台上的sizeof(int)
似乎是4.因此,sizeof(struct Person*)+4
恰好与struct Person
的大小匹配。
答案 1 :(得分:1)
因为你想分配足够的空间来容纳整个结构,而不仅仅是指向它的指针。
即,使用sizeof(struct Person)
而非sizeof(struct Person*)
。
sizeof(struct Person*)+4
巧合在你的平台上足够大。