2

アドレスが指す値を出力しようとしていますが、問題は、渡されたサイズに基づいてこのポインターを逆参照する必要があることです。したがって、この種の何か:

void print(Address addr, Int size) {
...
}

私はこれを達成する方法について少し混乱しています。誰かが私を正しい方向に向けることができますか?

編集:わかりました、私は考えています:

char p[80];
memset(p, '\0', 80);
memcpy(p, addr, size);

そして、*pとして逆参照します。より良い方法または正しい方法がある場合は、私に知らせてください

4

3 に答える 3

3

あなたの質問は非常に不明確です。渡されたアドレスから任意のバイナリデータをダンプする場合は、次のようにします。

void print(const unsigned char *addr, size_t size)
{
    while (size--) printf("%.2x", *addr++);
}

または、nullで終了していない文字データを印刷する場合は、次のことを試してください。

void print(const char *addr, int size)
{
    printf("%.*s", size, addr);
}
于 2010-10-15T04:48:14.150 に答える
0

それが数字である場合、私はそれがそうであると思います、あなたはこのようなものを必要とするでしょう:

int n=0;
if (size>sizeof(int)) { return; //int is too small };
for (int i=0;i<size;i++) {
  ((char*)(&n))[sizeof(int)-(i+1)] = ((char*)addr)[size-(i+1)];
}
printf("%d",n);
于 2010-10-15T04:49:10.873 に答える
0

ルーチンでswitchステートメントを使用できます。

switch (size) {
   case 1: print( *(char*)pointer); break;
   case 2: print( *(short*)pointer); break;
   case 4: print( *(long *)pointer); break;
   case 8: print( *(__int64*)pointer); break;
   default: puts( "unsupported);
}

(「print」は、おそらくC ++ポリモーフィズムを使用して、さまざまなサイズの整数を印刷するルーチンです)

洗練されたソリューションは、C ++テンプレートを使用することです。たとえばInteger、呼び出し時に実際の変数タイプに置き換えられるパラメータータイプを使用します。このルーチンは、この変数のサイズに作用するInteger可能性があります(1から8まで変化する可能性があり、より長い整数を自分で実装する場合はそれ以上になる可能性があります)。このアプローチのこの欠点は、コンパイラがすべてのタイプの引数に対してルーチンインスタンスを生成し、サイズに依存するロジックが一部のテストで「常に真」の条件になることです。簡単な方法は、常に予想される最も長いタイプの整数を使用することです。

于 2012-03-12T08:37:54.357 に答える