2017-01-22 30 views
0

私はCの構造体の配列にアドレスを割り当てる方法を見つけようとしていましたが、その成功は限られていました。うまく働いたと予想されるメモリ位置に私の構造体を配置Cの構造体の配列にアドレスを代入する

struct pdirectory *test = (struct pdirectory *)0x00001000; 

struct pdirectory { 
    uint16_t one; 
    uint8_t two; 
    uint8_t three; 
    uint16_t four; 
}; 

はここに私の構造体変数を宣言する時、私の最初の試みである:ここに私の構造体です。
しかし、構造体の配列にアドレスを割り当てることができません。
私は限られた成功を収めて疲れ次のコードを持っている:意図したアドレスに私の構造体を配置し、私も次のテストコードと異なるアレイにアクセスすることができます

struct pdirectory (*test)[1] = (struct pdirectory *)0x00001000; 

void initialise_virtual_manager(){ 
test[0]->one = 0x3333; 
test[0]->four = 0x3333; 
test[1]->one = 0x3434; 
test[1]->four = 0x3434; 
test[2]->one = 0x3535; 
test[2]->four = 0x3535; 
} 

私が知っている私上記のコードは正しくありません。私は構造体のサイズ(これは私がやろうとしているものではない)でメモリ内の配列エントリをオフセットする構造体減速の配列番号を変更するのに飽き飽きしました。1024ストラットの配列を宣言したいと思います。また、上記のコードでは、配列の無制限量にアクセスすることができます(これは、私が望むものではありません。配列番号でアクセスできる配列の数を制限します)。誰かが私が間違っていることを見ることができたり、私が持っているこの問題を解決するための他の提案があれば、それは大きな助けになるでしょう。 1については

+0

最初のバージョンでは、 'test [0] .one'、' test [1] .one'、 'test [2] .one'などを使うことができます。 –

+0

あなたのコードはありません"代わりにそのアドレスを指しています。実際にstructへのポインタである変数を宣言するときには、 "struct variableを宣言します"と言ってください。 –

+0

'struct pdirectory array [1024];を実行するのはどうでしょうか?これは、 'struct pdirectory'を1024個保持できるようにする(メモリ割り当てを意味する)' array'を定義します。 – alk

答えて

0

、あなたは配列を指すように方法を知っているように見えることから、適切なキャストを使用します。

struct pdirectory (*test)[N] = (struct pdirectory (*)[N])0x00001000; 

を第二に、test[i]配列サイズ単位でポインタ演算を実行します。あなたは上記の配列としてtestを扱う配列へtestポイントということが、インデックスにはない見ることができるように

*(struct pdirectory(*)[N])((unsigned char*)test + i * sizeof(struct pdirectory) * N) 

:配列のサイズがNである場合には、配列アクセスは同じになります。

あなたの配列アクセスは、したがって、次のようにする必要があります:

(*test)[0].one = 0x3333; 
(*test)[0].four = 0x3333; 

まずtest逆参照され、その後にのみ配列がインデックス化されています。

関連する問題