- ベストアンサー
C の配列
C で、配列 char a[8]; int b[8]; をメモリの連続した領域に配置し、 a[8] とすれば b[0] がアクセスできるようにしたいのですが可能でしょうか。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
きっちり書くと、こんなのとか(little endianを想定します) : #include <stdio.h> union _buf { char a[32]; struct _type_int { char _dummy[8]; int b[0]; } type_int; } buf; int main(int argc,char *argv[]){ buf.type_int.b[0] = 55; printf( "%d, %d\n", buf.a[8], buf.a[9] ); } こっちの方が、てっとり速いでしょうが。 char a[32]; int *b; b = (int*)(a + 8); b[0] = 55;
その他の回答 (3)
構造体を使えば連続します。 ただし、型の大きさは処理系依存なので、アライメントも処理系依存です。 struct foo { char a[8]; int b[8]; }; struct foo bar; bar.a[8] = 1;
お礼
回等ありがとうございます。 > アライメントも処理系依存です。 というところが気になりますね。
- MovingWalk
- ベストアンサー率43% (2233/5098)
こんな感じでもできますが。 #include <stdio.h> int main(void) { char a[8 + sizeof(int)*8]; int *b; b = (int *)&a[8]; b[0] = 0x12345678; printf("b[0] = %08x, %02x\n", b[0], a[8]); exit(0); }
お礼
回等ありがとうございます。 色々なやり方があるものですね。
- damejan
- ベストアンサー率30% (58/192)
変数をそのまま使っている限り、できません。どうしてもそのようなことをしたいのであれば、char型の変数とint型の変数をメンバーにもつ共用体を定義して、この共用体型のポインタ配列を使えばできると思います。 ただ、配列のどこから共用体のメンバ参照をchar変数からint変数へ変えるための処理が必要ですね。
お礼
回等ありがとうございました。 割と面倒ですね。アセンブラなら簡単なのに。
お礼
回等ありがとうございました。 割と面倒ですね。アセンブラなら簡単なのに。