是否有可能snprintf返回以'\ 0'开头的char数组?

时间:2011-07-18 11:38:43

标签: c++ linux

我有以下代码:

string getid()
{   
    pthread_t tid = pthread_self();
    struct timeval tv;
    gettimeofday(&tv, NULL);
    uint64_t t = static_cast<uint64_t>(tv.tv_sec);
    char buf[64];
    snprintf(buf, 64, "%ld-%ld", static_cast<uint64_t>(tid), static_cast<uint64_t>(t));

    return buf;
}

有时,返回的字符串有0个size(),我想一个可能的原因是buf [0]是'\ 0',这意味着pthread_self返回'\ 0'开始char数组?

2 个答案:

答案 0 :(得分:1)

pthread_self返回pthread_t,不一定是整数类型。所以你的演员甚至没有意义。

接下来,%ld引用long int,但您传递的是uint64_t个值。根据系统long int的大小,这可能再次没有多大意义。

但是,要找到你的问题:检查snprintf调用的返回值:它返回已成功写入的字符数。如果它不是至少3,那么出现问题。

答案 1 :(得分:0)

要打印64位数字,它不是%ld。最便携的是使用非常丑陋的PRIu64,如:

printf("%"PRIu64"\n", u64); 

但我认为%llu也可能适用于您的平台。

正如其他人所指出的那样,您将返回一个指向自动数组的指针,这意味着它将驻留在临时存储中(在某些情况下可能不是堆栈)。将指针返回到由new分配的数组,或者如果您不需要重入,请声明缓冲区static,但这不是一个非常好的解决方案,使用{{在堆上分配它1}}将是首选。