2016-09-24 2 views
2

10進表記でポインタを印刷するにはどうすればよいですか?Printfポインタ(10進表記)

-Wallでコンパイルすると、以下のいずれも望ましい結果になりません。私はエラーを理解し、-Wallでコンパイルしたいと思います。しかし、どうすれば10進表記でポインタを印刷できますか?

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    int* ptr = malloc(sizeof(int)); 
    printf("%p\n", ptr);     // Hexadecimal notation 
    printf("%u\n", ptr);     // -Wformat: %u expects unsigned int, has int * 
    printf("%u\n", (unsigned int) ptr); // -Wpointer-to-int-cast 
    return EXIT_SUCCESS; 
} 

(私はドットグラフのノード識別子としてポインタを使用していますので、これは必要とされ、そして0x..は有効な識別子ではありません。)

答えて

7

Cがあるデータ型と命名いるuintptr_tを、持っていますポインタを保持するのに十分な大きさ。 %pはvoid *型のポインタを期待していますが、-pedanticを使用してコードをコンパイルする場合、gccが警告することに注意を

#include <stdio.h> 
#include <stdlib.h> 
#include <inttypes.h> 

int main(void) 
{ 
    int* ptr = malloc(sizeof *ptr); 
    printf("%p\n", (void *)ptr);     // Hexadecimal notation 
    printf("%" PRIuPTR "\n", (uintptr_t)ptr); 
    return EXIT_SUCCESS; 
} 

を:一つの解決策は、(uintptr_tを)へのポインタ(キャスト)に変換して、以下に示すようにそれを印刷することです。

string format for intptr_t and uintptr_tも関連するようです。

1

'一部のプラットフォームではファイルにPRI*PTRマクロが提供されていないという報告があります。あなたの場合は、代わりにprintf("%ju\n", (uintmax_t)ptr);をお試しください。

... GNU Cで作業しているように見えるので、これらのマクロを用意する必要があります。