printf(3C)、sprintf(3C)、 scanf(3C)、 sscanf(3C) が long
またはポインタ引数に対して使用される場合、それらを long
またはポインタ引数用に変更する必要がある場合があります。ポインタ引数を 32 ビットおよび 64 ビット環境で動作させるためには、書式文字列に指定する変換操作を %p にしてください。次に例を示します。
char *buf; struct dev_info *devi; ... (void) sprintf(buf, "di%x", (void *)devi);
この場合、次の警告が出ます。
warning: function argument (number) type inconsistent with format sprintf (arg 3) void *: (format) int
次のコードを使用すると、正しい結果が出ます。
char *buf; struct dev_info *devi; ... (void) sprintf(buf, "di%p", (void *)devi);
さらに、buf
によって示される記憶領域に 16 桁を格納できる大きさが十分にあることを確認してください。long
引数の場合は、long
サイズ指定子 l を書式化文字列の変換操作文字の前に追加してください。次に例を示します。
size_t nbytes; ulong_t align, addr, raddr, alloc; printf("kalloca:%d%%%d from heap got %x.%x returns %x\n", nbytes, align, (int)raddr, (int)(raddr + alloc), (int)addr);
この場合、次の警告が出ます。
warning: cast of 64-bit integer to 32-bit integer warning: cast of 64-bit integer to 32-bit integer warning: cast of 64-bit integer to 32-bit integer
次のコードを使用すると、正しい結果が出ます。
size_t nbytes; ulong_t align, addr, raddr, alloc; printf("kalloca:%lu%%%lu from heap got %lx.%lx returns %lx\n", nbytes, align, raddr, raddr + alloc, addr);