web-dev-qa-db-ja.com

ポインターはprintf()では機能しません

ポインターの出力に問題がある。以下のプログラムをコンパイルしようとするたびに、次のエラーが発生します。

pointers.c:11: warning: format ‘%p’ expects type ‘void *’, but argument 2 has type ‘int *’

私はここで明らかに簡単なものを見逃していますが、私が見た同様のコードの他の例から、これはうまくいくはずです。

ここにコードがあります、どんな助けでも素晴らしいでしょう!

#include <stdio.h>

    int main(void)
    {
       int x = 99;
       int *pt1;

       pt1 = &x;

       printf("Value at p1: %d\n", *pt1);
       printf("Address of p1: %p\n", pt1);

       return 0;
    }
31
Chris

Intポインターをvoidにキャストするだけです:

_printf( "Address of p1: %p\n", ( void * )pt1 );
_

コードは安全ですが、_-Wformat_警告フラグを使用してコンパイルしているため、printf()およびscanf()の呼び出しを型チェックします。

45
Macmade

簡単な警告が表示されることに注意してください。コードはおそらく期待どおりに実行されます。

"%p" printfへの変換指定子には、void*引数; pt1はタイプint*

警告は、int*およびvoid*は、奇妙な実装では、異なるサイズまたはビットパターンまたは何かを持つ場合があります。

int*からvoid*キャスト付き...

printf("%p\n", (void*)pt1);

...そして、奇妙な実装であってもすべてがうまくいきます。

10
pmg

この場合、コンパイラは警告に対して少し熱心です。コードは完全に安全です。オプションで警告を削除できます:

printf("Address of p1: %p\n", (void *) pt1);
2
Erik

メッセージにはすべてが記載されていますが、それ自体はエラーではなく単なる警告です。

printf("Address of p1: %p\n", (void*)pt1);
1
karlphillip