-2
#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 不是唯一的。

4

1 回答 1

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是数组类型,所以参数实际上是 type 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软件包才能构建和运行该程序。

于 2012-04-18T08:55:11.937 回答