• ベストアンサー

C の配列

C で、配列 char a[8]; int b[8]; をメモリの連続した領域に配置し、 a[8] とすれば b[0] がアクセスできるようにしたいのですが可能でしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

きっちり書くと、こんなのとか(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;

tttt23
質問者

お礼

回等ありがとうございました。 割と面倒ですね。アセンブラなら簡単なのに。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

noname#30727
noname#30727
回答No.4

構造体を使えば連続します。 ただし、型の大きさは処理系依存なので、アライメントも処理系依存です。 struct foo { char a[8]; int b[8]; }; struct foo bar; bar.a[8] = 1;

tttt23
質問者

お礼

回等ありがとうございます。 > アライメントも処理系依存です。 というところが気になりますね。

全文を見る
すると、全ての回答が全文表示されます。
  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.3

こんな感じでもできますが。 #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); }

tttt23
質問者

お礼

回等ありがとうございます。 色々なやり方があるものですね。

全文を見る
すると、全ての回答が全文表示されます。
  • damejan
  • ベストアンサー率30% (58/192)
回答No.1

変数をそのまま使っている限り、できません。どうしてもそのようなことをしたいのであれば、char型の変数とint型の変数をメンバーにもつ共用体を定義して、この共用体型のポインタ配列を使えばできると思います。 ただ、配列のどこから共用体のメンバ参照をchar変数からint変数へ変えるための処理が必要ですね。

tttt23
質問者

お礼

回等ありがとうございました。 割と面倒ですね。アセンブラなら簡単なのに。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語の配列のコピーについて

    C言語の配列のコピーについて int a[] = {1,2,3}; int b[3]; memcpy(b, a, sizeof(a)); は、分かるのですが、 int c[][3] = { {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12} }; int d[4][3]; memcpy(d, c, sizeof(c)); の使い方は正しいのでしょうか? 1次元配列の場合は連続するメモリ?なのでmemcpyでOKだと思うのですが 2次元以上の配列の場合は、メモリが連続しているか知らないので 不安に思いました。 実際、C言語でのメモリの取り方など詳しく書かれている本などありますか? よく初心者向け本にメモリは箱という大雑把なイメージで取り挙げられているのですが、突っ込んだ書籍等も探しています。 玄人の方、難しく(^^教えてください。

  • 多元配列について(ANSI C)

    動的多元配列で、 Voidポインタに、多種の型がぶら下がった多元配列を作り、 読み書きをしたいのですがどのようにしたらよろしいでしょうか。 具体的には、 x[0][1]は、intで「2」が入っている x[0][4]は、intで「9」が入っている x[1][2]は、charでしかも文字列の配列で「goo」が入っている x[1][5]は、charでしかも文字列の配列で「教えて」が入っている x[0]は、int型の配列。X[1]は、文字列型の配列。 というようなものです。 一応ソースは作ってみたのですが、int型では問題なくいくのですが、 文字列は、コンパイルはできますが、実行すると予期せぬことが起きます。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main (void) {      void **topPointa;      int * iDataInput;      int * iDataOutput ;      char * chDataInput;      char * chDataInput2;      char * chDataOutput1 ;      // ポインタアドレス用のメモリ確保      topPointa = (void *) calloc (10 , sizeof(void *));      if(topPointa == NULL) {           printf("メモリが確保できません\n");           exit(-1);      }      //int配列のメモリ確保      iDataInput = (int * ) calloc (10 , sizeof(int));      if(iDataInput == NULL) {           printf("メモリが確保できません\n");           exit(-1);      }      iDataInput[0] = 3 ;      iDataInput[1] = 4 ;      topPointa[0] = (void * ) &iDataInput;      //int配列の取り出し      iDataOutput = *(int *) topPointa[0];      printf( "int: %d\n", iDataOutput[0] );      printf( "int: %d\n", iDataOutput[1] );      //char配列 のメモリ確保      chDataInput = (char * ) calloc (10 , sizeof(char *));      if(chDataInput == NULL) {           printf("メモリが確保できません\n");           exit(-1);      }      chDataInput2 = (char * ) calloc (10 , sizeof(char));      if(chDataInput2 == NULL) {           printf("メモリが確保できません\n");           exit(-1);       }      strcpy(chDataInput2 , "hoe");      chDataInput[0] = &chDataInput2;      topPointa[1] = (void * ) &chDataInput;      //char配列の取り出し      chDataOutput1 = *(char *) topPointa[1];      printf( "char: %S\n", chDataOutput1[0] );      free(iDataInput);      free(chDataInput);      free(chDataInput2);      return 0; } 言語は、C言語ANCI Cでお願いします。 以上。よろしくお願いします。

  • 関数に配列を渡して値を変える

    関数に配列を渡して値を書き換えたいのですが、文字配列である char b[10]="abc"; の書き換えが綺麗にできません。 どのように書いたら綺麗にできますか? void hen(int *a, char *b,char **c){ *a=7; b[0]='d'; b[1]='e'; b[2]='f'; //こういう書き方なら渡せるけれどb[10]="def"; 見たいな書き方で一行で値を渡す方法はないものかな? *c="jkl"; } void main (void){ int a=5; char b[10]="abc"; char *c="ghi"; hen(&a,b,&c); printf("%d %s %s\n",a,b,c); }

  • c言語 int型の数字をchar型の配列に

    c言語についてです。 int型の数字をchar型の配列に入れたいです。 関数に対してint型の数字を文字列として渡し、 関数内でchar型の配列に格納したいです。 例として、 a(char a[]){  ~~  ~~ } int main(void){ int x = 5678;  ~~  a(x); } とできるようにしたいです。 しかしこれだと5678という値がそのままchar型の一つの配列に入る?ため正しくないです。 欲しい結果としてはちゃんとa関数内で、 a[1] = '5' a[2] = '6' a[3] = '7' a[4] = '8' となってほしいです。 もともと渡す値が”5678”となっていれば結果は正しく出るのですが、 渡す値がint型と決まっているためどうにかして5678を”5678”とすればいいのではないかと考えています。 つまり5678を単純に文字列に変換すればいいのでしょうか? またプログラム内ではsprintfやatolを使用しないで実現させたいです。 難しいかもしれませんがお願いします。 なんだか説明が下手ですみません。 お願いいたします。

  • 配列の配列の入れ替え処理(C/C++)

    int a[5][2]とすると a[0][0] : 0 a[0][1] : 1 a[1][1] : 2 a[1][1] : 3 a[2][0] : 4 a[2][1] : 5 a[3][0] : 6 a[3][1] : 7 a[4][0] : 8 a[4][1] : 9 こういう形で領域が確保されるはずですが、この配列同士の入れ替えで困っています。 例えば、a[0]とa[4]を交換して a[0][0] : 8 a[0][1] : 9 a[1][1] : 2 a[1][1] : 3 a[2][0] : 4 a[2][1] : 5 a[3][0] : 6 a[3][1] : 7 a[4][0] : 0 a[4][1] : 1 となるようにしたいのです。 普通はスワップするときにテンポラリとして値を保持する物を確保しておくのですが、型がわからず困っています。 普通にint型どうしの入れ替えなら int tmp,a,b; tmp = a; a = b; b = a; とすれば良いのですが、上の配列の配列どうしの入れ替えでどう書けばいいかよくわかりません。自分で書くと「型が違うよ」と怒られてしまいました。 どう書けば入れ替えできるのでしょうか?

  • C#かJavaで、配列の中から別の配列を探し出す

    お世話になります。 C#かJava(CやC++は入れない)で、特定の配列の中に、該当する 配列があるかどうかを調べるメソッドがあれば、教えてください。 例えば… int[] a={0,0,0,1,2,3,4,5,6,7}; int[] b={3,4,5}; ならば、『5』が返ってくるなどです。 力技では、aの配列を順にみていき、bの一番目と同じなら、 お互いの配列の次の要素を比較…などとやっていくのですが、 これらの方法を、標準のメソッドがあれば…と思い、 質問させていただきました。 以上、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 関数から配列を返すには?

    return で配列を返すにはどうしたらよいのでしょうか。 例えば以下のような場合です。 int main (){ char Value[] = "999"; int a;  a = test(Value);  printf ("%d", a);   } int test(char *Value) { int nVal[255]; ここで nVal に適当な処理をして・・・  return Value; }  int a を配列とかにしてみましたけど、コンパイラが 通りません。 要は配列数値を main で受け取って表示したいのですが、 本日C言語はじめたところなので、教えていただければありががたいです。

  • C言語の基礎的な質問---文字配列の初期化

    C言語の配列の初期化に関する質問です。 もし規格によって回答が異なる場合は、ANSIのCということにしてください。 関数の中に、 char str[ ]="ABC"; (イ) という宣言があるとします。(staticは付きません。) これは、 char str[ ]={'A', 'B', 'C', '\0'}; (ロ) と全く同じ意味でしょうか。  似て非なるものに char *str="ABC"; (ハ) というものがあります。この場合は、 strとは違うところに"ABC"('C'の次には'\0'があります。)という領域が確保されていて、 その先頭アドレスでstrが初期化されるのですよね。 (イ)(ロ)(ハ)のいずれの場合も関数の中に書かれているとすれば、 いずれもstrは自動変数で、関数実行時にstrの領域が確保されますよね。 (イ)は配列strの領域が確保されるときに、 配列strとは別のところにある"ABC"という領域の内容を、コピーして設定する、 ということでしょうか。 (ロ)は、配列の領域確保時にstr[0]を'A'で、str[1]を'B'で、str[2]を'C'で、str[3]を'\0'で、初期化する、 ということで、 配列とは別のところには"ABC"という領域はない、 という考えでよろしいでしょうか。 もしそうだとしたら、配列とは別のところに"ABC"という領域があるかどうかという点で(イ)と(ロ)は異なることになりますが、そう考えてよろしいのでしょうか。 それとも、そういうことは処理系に依存することなんでしょうか。

  • C言語、配列、動的にメモリを割り当て

    すみません。お助けください。 動的なメモリの割り当てによって配列を複数作るときに、メモリを割り当てるルーチンを外部関数化したいのですが、うまくいきません。 具体的にはつぎのような感じです。 b[2] に 値を代入するときに Segmentation fault(core dumped) になってしまいます。 正しくは、どのようにすればよいのでしょうか。 よろしくお願いたします。 main() { int n=5; double *a, *b; mymalloc( a, n ); mymalloc( b, n ); a[2] = 3.5; printf( "%f\n", a[2] ); b[2] = 4.4; printf( "%f\n", b[2] ); } int mymalloc(double *c, int n) { c = (double *)malloc( n * sizeof(double)); }

  • C言語のポインタと配列

    どうにも理解しようとしていますが全体像が理解できないので、わかっていることわからないことまとめていくのでバンバン指摘してくださるとうれしいです。 1.配列の宣言には int a[]; a[] = {1,2,3}ですが、コンピュータは{"1","2","3"}の部分の数を数えて[]に代入しているので、 int [][3] = {{1,2,3},{4,5,6}}のような配列を作ったとき[][3]の部分の左側の数字も勝手に代入している。 この時なぜ3が勝手に代入されないかがわからない 2.数字とメモリ int s = {1,2,3}をメモリ的に表現すると、123の順に並んでいる。s[1]=2 int s[][2] = {{1,2,3},{4,5,6}}をメモリ的に表現すると123456に並んでいる。s[1][1]= 5 ここまで文字列以外の配列は添え字だけで管理されている。 3.文字列とポインタ char s[] = "abc"とするとメモリ的にはabc\0であり、[]には4が代入され、s[1]はb自身を指す。 char *s = "abc"をメモリで表すとabc\0であり、\0が来るまでを文字列と認識する。 sは&s[0]とも表現できるように、最初のアドレスを指し示している。 char *s[]= {"abc","def"}をメモリ的に表現するとabc\0def\0であり、[]には2がコンピュータにより判断されて代入される。\0までを文字列として表現しようとする。s [1] は"def"の最初のアドレスを指し示すが、s[1][1]とするとe自身を指すようになる。この時、s[1] = &s[1][0]と表現することは可能であると考えられる。 文字列を直接さす場合でも、ポインタで表現する場合でも、\0が要素の最後に来るのでしょうか? また、{{"abc","def"},{"ghi","jkl"}}を文字列で直接表す場合は char s[2][2] = {{"abc","def"},{"ghi","jkl"}}; となるかと思いますが char *s[2][2] = {{"abc","def"},{"ghi","jkl"}}; とするとs[1][1]でghiの最初のアドレスを、s[1][1][0]でg自身を表せるようになるのでしょうか?