vsprintf缓冲区的动态内存分配

Dynamic memory allocation of buffer for vsprintf

我想分配一个动态内存给一个buffer,我通过vsprintf();把数据存储在里面。我正在创建一个需要使用 vsprintf 的日志记录机制,每次我的数据都不同,所以我想为缓冲区分配动态内存。但我不知道如何获得 formatva_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;
}