sách gpt4 ai đã đi

c - 解决 valgrind 中的无效写入错误

In lại 作者:行者123 更新时间:2023-11-30 18:35:20 25 4
mua khóa gpt4 Nike

我对使用 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 是否返回有效的指针吗?

1 Câu trả lời

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

client_context = malloc(sizeof *client_context);

您的代码不起作用的原因是 sizeof client_context bình đẳng sizeof(void *) ,它与 sizeof(ClientContext) 不同.

此外,请始终检查 malloc() 是否确实成功。

关于c - 解决 valgrind 中的无效写入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46965827/

25 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com