printf(3S)、sprintf(3S)、scanf(3S)、sscanf(3S) が 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); |
long
引数の場合は、long
サイズ指定子 l
を書式化文字列の変換操作文字の前に追加してください。さらに、buf
によって示される記憶領域に 16 桁を格納できる大きさが十分にあることを確認してください。次に例を示します。
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); |