1

私が構造体を持っていると仮定して

typedef struct  
{ 
   unsigned char mem1; 
   unsigned char *mem2
} MEMBERS;

どこ

 unsigned sample = 12
 MEMBERS memvalues = {  0x15 , &sample  };

関数「GET_MEM」が構造体「MEMBERS」のアドレスをX_memに返す場合、値mem1とmem2の両方にアクセスする必要があります。私が言いたいのはこれです:

unsigned char *X_mem = GET_MEM ( );    //function returns address of memvalues
unsigned value1 = *X-mem;
unsigned Value2 = *++X_mem;

value1に0x15を与え、value2に12を与えたい。

どうすればこれを機能させることができますか?

注:上記のコード例が構文的に正しいと想定しないでください。それは私の意図を表現するためだけのものです。フォークスに感謝します。

4

3 に答える 3

1

X_memがMEMBERS構造体へのポインターとして宣言されていない限り、このように機能させることはできません。コンパイラーはmem1の後のどこにでも、構造体に任意の数のパディングバイトを自由に追加できるため、構造体の先頭からのアドレスオフセットに依存することは危険であり、移植性がありません。したがって、正しい解決策はMEMBERS *X_mem、->演算子を使用して各メンバーに書き込み、アクセスすることです。

何らかの理由でこのようなオフセットに依存するコードを作成する必要がある場合は、「パディングバイトパターン」が期待どおりであること、またはパディングが完全に無効になっていることを確認する必要があります。

于 2013-01-31T15:24:39.807 に答える
1

GET_MEM():によって返される誤って入力されたポインタをキャストする必要があります。

const MEMBERS *some_members = (MEMBERS *) GET_MEM();
unsigned value1 = some_members->mem1;
unsigned value2 = *some_members->mem2;
于 2013-01-31T15:23:40.900 に答える
1

ええ、GET_MEM()に構造体のアドレスを返させます。

MEMBERS *X_mem = GET_MEM( );    //function returns address of memvalues
unsigned char value1 = X_men->mem1;
unsigned char Value2 = *(X_mem->mem2);
于 2013-01-31T15:23:54.860 に答える