1

cでスタックの16進ダンプを取得するコードを書いています。ubuntuでgccを使用してコンパイルすると、この次の行でコンパイルエラーが発生し続けますが、Windowsのgccでは正常にコンパイルされます。

char buffer[10];
for (int i=0;i<20;i++)
    printf("0x%lx => 0x%lx\n", &(buffer[i]), ((long *)buffer)[i]);

これは、コンパイラが与えるメッセージです。

警告: フォーマット '%lx' はタイプ 'long unsigned int' を想定していますが、引数 2 のタイプは 'char *' です</p>

私が何か間違ったことをしている場合、誰かが私に教えてもらえますか?

4

2 に答える 2

3

を使用%pしてポインターを出力し、 にキャストすることを忘れないでvoid *ください。

printf("%p => ??\n", (void *)&(buffer[i]), ...);

何をしようとしているのかはわかりませんが、 の一部をbufferlong として解釈して印刷しようとしている場合は、 を使用できます%ld

于 2012-08-10T16:15:48.050 に答える
2

試す:

char buffer[10];
for (int i=0;i<20;i++)
    printf("%p => 0x%lx\n", (void*)&(buffer[i]), ((long *)buffer)[i]);

2 番目の引数&(buffer[i])は 型char*であるため、キャストと%p.

3 番目の引数((long *)buffer)[i]はタイプlongであるため、%lx.


余談:がアラインされてbufferいない場合long、CPU、OS、OS の設定、および/またはコンパイラに応じて、正しい答え、間違った答え、またはコア ダンプが得られる可能性があることに注意してください。

それがだったら、私は試してみます:

long l;
for(int i = 0; i < 20; i++)
    printf("%p => 0x%lx\n", (void*)(&l+i), *(&l+i));
于 2012-08-10T16:19:35.540 に答える