#include <stdio.h>
#include <stdlib.h>
#include <uuid/uuid.h>
int main(void) {
puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
uuid_t uuid;
int uuid_generate_time_safe(uuid);
printf("%x",uuid);
return EXIT_SUCCESS;
}
我只是想知道为什么uuid不是16字节长? 我用DEBUG查看内存,确实不是16字节。 我使用libpcap来开发我的程序,uuid并不是唯一的。
答案 0 :(得分:11)
我刚刚在我的系统上尝试过您的程序,uuid
16个字节。但是你的程序没有显示它的大小。
该行:
int uuid_generate_time_safe(uuid);
不是对uuid_generate_time_safe
函数的调用,它是该函数的声明,uuid
作为单个参数的(忽略)名称。 (而且这种函数声明在1999年的标准中甚至没有效率,它取消了旧的“隐式int
”规则。)
您的printf
来电:
printf("%x",uuid);
有未定义的行为; "%x"
需要unsigned int
类型的参数。
如果您查看/usr/include/uuid/uuid.h
,您会看到uuid_t
的定义是:
typedef unsigned char uuid_t[16];
uuid_generate_time_safe
(见man uuid_generate_time_safe
)的正确声明是:
int uuid_generate_time_safe(uuid_t out);
您不需要在自己的代码中声明;它由#include <uuid/uuid.h>
提供。
因为uuid_t
是一个数组类型,所以参数实际上是unsigned char*
类型,这就是函数看似能够修改其参数的原因。
这是一个更正确的程序,用于说明函数的使用:
#include <stdio.h>
#include <uuid/uuid.h>
int main(void) {
uuid_t uuid;
int result = uuid_generate_time_safe(uuid);
printf("sizeof uuid = %d\n", (int)sizeof uuid);
// or: printf("sizeof uuid = %zu\n", sizeof uuid);
if (result == 0) {
puts("uuid generated safely");
}
else {
puts("uuid not generated safely");
}
for (size_t i = 0; i < sizeof uuid; i ++) {
printf("%02x ", uuid[i]);
}
putchar('\n');
return 0;
}
在我的系统上,我得到以下输出:
sizeof uuid = 16
uuid not generated safely
26 9b fc b8 89 35 11 e1 96 30 00 13 20 db 0a c4
有关“uuid未安全生成”消息可能出现原因的信息,请参见手册页。
请注意,我必须安装uuid-dev
包才能构建和运行此程序。