【发布时间】:2017-10-27 00:40:23
【问题描述】:
我对使用 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)
它解决了这个代码,我试图在其中分配一个结构(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 是否返回有效指针?
【问题讨论】:
-
打印出
sizeof(client_context)的结果,我敢打赌是4或8。 -
对指针执行
sizeof总是返回指针本身的大小,而不是它所指向的(或它可能指向的)未来,这是无法预测的)。
标签: c memory-management struct valgrind