2012-04-18 36 views
-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不是唯一的。關於Linux C - UUID

+1

你如何確定它不是16字節長?如果你檢查sizeof(uuid)'會發生什麼?你爲什麼不使用['uuid_parse()'](http://linux.die.net/man/3/uuid_parse)? – 2012-04-18 08:45:54

+3

我會告訴你什麼不是16個字節長。與'%x'相對應的參數。 – asveikau 2012-04-18 08:47:05

+0

@OliCharlesworth uuid_t = char [16],它在uuid頭文件中定義。 – user1111073 2012-04-18 08:49:30

回答

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包才能構建和運行此程序。

+0

謝謝。我懂了。你的計劃非常好 – user1111073 2012-04-18 09:13:49