关于 asprintf 的 Valgrind:地址是大小为 <size> 分配的块内的 0 字节
Valgrind about asprintf: address is 0 bytes inside a block of size <size> alloc'd
我有一些这样的代码:
void logConnectionStatus(char * domain, char * status, mqd_t logQueue) {
char * message;
asprintf(&message, "Connection to domain %s: %s", domain, status);
mq_send(logQueue, message, 1024, 0);
free(msg);
}
但是 valgrind 检查说
Address 0x566c0f5 is 0 bytes inside a block of size 53 alloc'd
可能是什么原因?谢谢。
(假设您的意思是 mq_send(logQueue, msg, 1024, 0);
,因为这里找不到 message
)
asprintf
调用没问题(除非 domain
或 status
是 corrupt/null 指针)。
但紧接着,您发送了一条大小为 1024
的消息,可能远远超出了 msg
字符串大小(因为 domain
和 status
可能是人类-可读的短字符串)。
您应该记下 asprintf
returns 的打印字符数并在下一次调用中使用:
char * msg;
int nb_printed = asprintf(&msg, "Connection to domain %s: %s", domain, status);
mq_send(logQueue, msg, nb_printed, 0);
free(msg);
我有一些这样的代码:
void logConnectionStatus(char * domain, char * status, mqd_t logQueue) {
char * message;
asprintf(&message, "Connection to domain %s: %s", domain, status);
mq_send(logQueue, message, 1024, 0);
free(msg);
}
但是 valgrind 检查说
Address 0x566c0f5 is 0 bytes inside a block of size 53 alloc'd
可能是什么原因?谢谢。
(假设您的意思是 mq_send(logQueue, msg, 1024, 0);
,因为这里找不到 message
)
asprintf
调用没问题(除非 domain
或 status
是 corrupt/null 指针)。
但紧接着,您发送了一条大小为 1024
的消息,可能远远超出了 msg
字符串大小(因为 domain
和 status
可能是人类-可读的短字符串)。
您应该记下 asprintf
returns 的打印字符数并在下一次调用中使用:
char * msg;
int nb_printed = asprintf(&msg, "Connection to domain %s: %s", domain, status);
mq_send(logQueue, msg, nb_printed, 0);
free(msg);