C++ snprintf是否可能返回以';开头的字符数组\0';?

C++ snprintf是否可能返回以';开头的字符数组\0';?,c++,linux,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_

我有以下代码:

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;
}
string getid()
{   
pthread_t tid=pthread_self();
结构时间值电视;
gettimeofday(&tv,NULL);
uint64\u t=静态广播(电视、电视节目);
char-buf[64];
snprintf(buf,64,“%ld-%ld”,静态施法(tid),静态施法(t));
返回buf;
}

有时,返回的字符串有0 size(),我认为一个可能的原因是buf[0]是“\0”,这意味着pthread\u self返回“\0”开始字符数组?

pthread\u self
返回一个
pthread\u t
,它不一定是整数类型。所以你的演员阵容可能根本没有意义

接下来,
%ld
指的是一个
长int
,但您正在传递
uint64\t
值。根据系统上的
长int
的大小,这可能也没有多大意义


但是,为了回答您的问题:检查
snprintf
调用的返回值:它返回已成功写入的字符数。如果它至少不是3,那么就出了问题。

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

printf("%"PRIu64"\n", u64); 
但我认为,
%llu
也可以在您的平台上工作


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

只是一个挑剔的问题,对于无符号整数,应该说
%u
,但是对于固定宽度的整数,您应该使用
inttypes.h
中的宏。上述代码不应该生成空字符串(即
buf[0]='\0'
您可以在
snprintf
语句之后放置
assert(buf[0]!='\0')
。或者如果
语句打印警告,则放置
(然后在调试器中打印警告的行上设置断点等)@Andre Holzner:如果
snprintf
调用未能将第一个值写入缓冲区,则可能会生成一个空字符串,例如(而
buf
中的第一个字节恰好是
'\0'
).我只是做了一个实验:创建100个线程,每个线程执行上述getid()10000次,bug[0]永远不要是“\0”。我很困惑。@Raymond:在哪种情况下,它会给你一个空字符串?这种情况有什么特殊之处?它与你的实验设置有什么不同?在这种情况下,
snprintf
返回什么?没有返回指针-只有一个
字符串
(大概是
std::string
)从
buf
的内容构造的对象。因此,这一部分不是问题。但是类型的不一致用法是。是的,类型的使用不一致,谢谢。但我仍然不知道为什么在联机场景中返回的字符串有时大小为0。