-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"type の引数が必要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は配列型であるため、パラメーターは実際には typeunsigned 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 が安全に生成されていません」というメッセージが表示される理由については、man ページを参照してください。

uuid-devこのプログラムをビルドして実行するには、パッケージをインストールする必要があることに注意してください。

于 2012-04-18T08:55:11.937 に答える