用 snprintf / asprintf 取代不安全的 sprintf

摘自:https://blog.csdn.net/yhtoo/article/details/46943727

asprintf 第一个参数是指向指针的指针,它会在heap中自动申请空间(最后要手动free)。使用asprintf ,要加上 #define _GNU_SOURCE

int asprintf(char **strp, const char *fmt, ...);
int vasprintf(char **strp, const char *fmt, va_list ap);

描述

函数 asprintf()和 vasprintf()是 sprintf(3)和 vsprintf(3)的对等物,除了它们分配一个包括结尾空字符在内的足够大的输出内存,并且通过其第一个参数返回。这个指针应该传给 free(3)以在不再使用时释放它。

返回值

当成功时,如同 sprintf(3)一样,这些函数返回打印的字节个数。如果内存分配失败,或者其它错误发生了,这些函数返回 -1,并且 strp 的内容是未定义的。
#define _GNU_SOURCE         /* See feature_test_macros(7) */
#include <stdio.h>

// int asprintf(char **strp, const char *fmt, ...);

int main(int argc, char *argv[])
{
    char *c = NULL;

    t = asprintf(&c, "%s:%d", "abc", 123);
    if (t == -1) {
        printf("error occor");
    }

    free(c);
    
    return;
}