我有以下代码:
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数组?
答案 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}}将是首选。