vsprintf缓冲区的动态内存分配
Dynamic memory allocation of buffer for vsprintf
我想分配一个动态内存给一个buffer,我通过vsprintf();
把数据存储在里面。我正在创建一个需要使用 vsprintf 的日志记录机制,每次我的数据都不同,所以我想为缓冲区分配动态内存。但我不知道如何获得 format
和 va_list args
.
的大小
我不知道从哪里开始以及如何获得缓冲区长度
任何帮助都会很棒。
谢谢!
你不应该使用 vsprintf()
因为没有办法告诉这个函数目标数组的大小。您应该改为使用 vsnprintf()
,并且可以根据 vsnprintf()
的 return 值计算格式化字符串的长度。
这是一个例子:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int logstuff(const char *fmt, ...) {
char buffer[256];
char *str;
int length;
va_list args;
/* format the message into a local buffer */
va_start(args, fmt);
length = vsnprintf(buffer, sizeof buffer, fmt, args);
va_end(args);
if (length < 0) {
/* encoding error */
[...]
return -1;
}
if ((unsigned)length < sizeof buffer) {
/* message is OK, allocate a copy */
str = strdup(buffer);
} else {
/* message was truncated, allocate a large enough array */
str = malloc(length + 1U);
}
if (!str) {
/* allocation error */
[...]
return -1;
}
if ((unsigned)length >= sizeof buffer) {
/* format the message again */
va_start(args, fmt);
length = vsnprintf(str, length + 1U, fmt, args);
va_end(args);
}
/* store the message somewhere */
[...]
return length;
}
我想分配一个动态内存给一个buffer,我通过vsprintf();
把数据存储在里面。我正在创建一个需要使用 vsprintf 的日志记录机制,每次我的数据都不同,所以我想为缓冲区分配动态内存。但我不知道如何获得 format
和 va_list args
.
我不知道从哪里开始以及如何获得缓冲区长度
任何帮助都会很棒。
谢谢!
你不应该使用 vsprintf()
因为没有办法告诉这个函数目标数组的大小。您应该改为使用 vsnprintf()
,并且可以根据 vsnprintf()
的 return 值计算格式化字符串的长度。
这是一个例子:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int logstuff(const char *fmt, ...) {
char buffer[256];
char *str;
int length;
va_list args;
/* format the message into a local buffer */
va_start(args, fmt);
length = vsnprintf(buffer, sizeof buffer, fmt, args);
va_end(args);
if (length < 0) {
/* encoding error */
[...]
return -1;
}
if ((unsigned)length < sizeof buffer) {
/* message is OK, allocate a copy */
str = strdup(buffer);
} else {
/* message was truncated, allocate a large enough array */
str = malloc(length + 1U);
}
if (!str) {
/* allocation error */
[...]
return -1;
}
if ((unsigned)length >= sizeof buffer) {
/* format the message again */
va_start(args, fmt);
length = vsnprintf(str, length + 1U, fmt, args);
va_end(args);
}
/* store the message somewhere */
[...]
return length;
}