C 解决valgrind中的无效写入错误

C 解决valgrind中的无效写入错误,c,memory-management,struct,valgrind,C,Memory Management,Struct,Valgrind,一般来说,我对使用valgrind和C语言编程还不熟悉。我试图理解下面的valgrind信息 ==6225== Invalid write of size 4 ==6225== at 0x10000144D: handle_client (server.c:82) ==6225== by 0x10000186A: main (server.c:201) ==6225== Address 0x100a83248 is 0 bytes after a block of size 8 a

一般来说,我对使用valgrind和C语言编程还不熟悉。我试图理解下面的valgrind信息

==6225== Invalid write of size 4
==6225==    at 0x10000144D: handle_client (server.c:82)
==6225==    by 0x10000186A: main (server.c:201)
==6225==  Address 0x100a83248 is 0 bytes after a block of size 8 alloc'd
==6225==    at 0x10000BE81: malloc (vg_replace_malloc.c:302)
==6225==    by 0x100001431: handle_client (server.c:80)
==6225==    by 0x10000186A: main (server.c:201)
==6225== 
==6225== Invalid write of size 4
==6225==    at 0x100001458: handle_client (server.c:83)
==6225==    by 0x10000186A: main (server.c:201)
==6225==  Address 0x100a8324c is 4 bytes after a block of size 8 alloc'd
==6225==    at 0x10000BE81: malloc (vg_replace_malloc.c:302)
==6225==    by 0x100001431: handle_client (server.c:80)
==6225==    by 0x10000186A: main (server.c:201)
它解析为这段代码,在这段代码中,我试图分配一个struct ClientContext

#define DEFAULT_CC_CHANDLES 4
... 
[78]    // create the client context here
[79]    ClientContext* client_context = NULL;
[80]    client_context = malloc( sizeof(client_context) );
[81]    client_context->chandle_table = malloc( sizeof(GeneralizedColumnHandle) * DEFAULT_CC_CHANDLES );
[82]    client_context->chandles_in_use = 0;
[83]    client_context->chandle_slots = DEFAULT_CC_CHANDLES;
该结构的定义是:

typedef struct ClientContext {
    GeneralizedColumnHandle* chandle_table;
    int chandles_in_use;
    int chandle_slots;
    int client_fd;
} ClientContext;
那么到底是什么导致了这里的无效写入?我是否没有为结构分配足够的空间?我应该先检查alloc是否返回有效指针吗

client_context = malloc(sizeof(*client_context));
事实上,您正在为客户机上下文分配指针本身的大小,而不是指针内部所需的大小。这就像使用char*一样,您可以:


您将char放入char*这与结构相同

您将指针的大小传递给malloc,但这还不够,请尝试

client_context = malloc(sizeof *client_context);
代码无法工作的原因是,客户端上下文的sizeof等于sizeofvoid*,这与sizeofClientContext不同


另外,一定要检查malloc是否成功。

谢谢大家。通过改变来修正

client_context = malloc( sizeof(client_context) );

我不正确地将内存分配给变量client_context的大小,而不是实际的struct ClientContext

打印sizeofclient_context的结果,我打赌它是4或8。对指针执行sizeof操作总是返回指针本身的大小,而不是它指向什么或它将来可能指向什么,这是不可能预测的。但是sizeofchar始终是1,它实际上被标准指定为1。因此,通常情况下,没有人执行sizeofchar,这与SizeOfFint或sizeofdouble不同,后者可以在如何分配给定类型的大量元素的常见示例中使用。
client_context = malloc( sizeof(client_context) );
client_context = malloc( sizeof(ClientContext) );