したがって、約40バイトを指す非常に大きなポインタpがあります。
また、これらの40バイトは、int、char、およびその他のポインターを囲んでいることも知っています。私はこれらの40バイトを飛び越える方法も知っています。
デバッグのために、これらの内容を印刷したいと思います。それ、どうやったら出来るの?
たとえば、p + 16にintがあり、このintを出力したいとします。Cで「このアドレスから4バイトを出力し、それをintとしてフォーマットする」方法はありますか?
はい、キャストして間接参照するだけです。p
すでに設定していると仮定します。
int i = *(int *)(p + 16);
printf("%d\n", i);
潜在的な配置の問題に注意してください-たとえば、次のコード:
int i = *(int *)(p + 3);
一部のプロセッサで例外が発生する可能性があります(つまり、p
に対して安全に調整されていると仮定しint
ます)。その場合、バイトを自分でアセンブルする必要があります。これは、4バイト整数と8ビットバイトを想定した例です。エンディアンに注意してください。
unsigned char *p;
int bigEndian = p[3] << 24 + p[4] << 16 + p[5] << 8 + p[6];
int littleEndian = p[3] + p[4] << 8 + p[5] << 16 + p[6] << 24;
あなたはこのようなことをすることができます:
printf ("%d", *(int*)(p+16));
より良いアプローチは、それがそのように表現できるものである場合、印刷しようとしている構造の構造体を作成することかもしれません。何かのようなもの:
typedef struct someStruct {
int field1;
float field2;
char field3[8];
int field4;
} someStruct;
次に、次のようなことを行うことができます。
struct someStruct *p = (struct someStruct*)ptr;
printf ("%d", p->field4);