• ベストアンサー

2次元配列をポインタで参照したいのですが・・

下記Aのような2次元配列を作るとします。 A:1行あたり1024文字(ASCII)格納できるN行の2次元配列 Aの定義をまず下記Bのように行い、その後サイズ分メモリを確保しました。 B:char *str; この変数strを使って、x番目の行のy番目の文字を参照したい場合、どのようにすれば良いのでしょうか? 下記Cではやはりうまくいかないのでしょうか? C:str[x][y] 申し訳ございませんが、ご教授よろしくお願い致します。

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

  • ベストアンサー
  • ranx
  • ベストアンサー率24% (357/1463)
回答No.4

しばらくCから離れていたので、自信があやふやですが char (*str)[1024]; str = ((*)[1024])malloc(sizeof(*str)*N); でどうでしょう。 #2さんのように考えれば1024ではなく1025でも良いでしょう。 x行y列目は str[x-1][y-1] で参照できます。

ketchappt
質問者

お礼

目から鱗の回答、とても勉強になりました! どうも有難うございます!

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

その他の回答 (4)

noname#25358
noname#25358
回答No.5

 2次元配列の場合、「N個のポインタ配列」を作り、それをそれぞれ個別に制御する方法が挙げられます。  一番簡単なのは、   char **str;  という多重ポインタ配列を用意し、まず N 個のポインタ配列を malloc します。  str = (char**)malloc(sizeof(char*)*N);  次に、確保した N 個の配列に、1つずつ文字列を malloc していきます。  for ( i = 0; i < N; i++ ) {   str[i] = (char*)malloc(256);  }  このとき、   str[x]  は、N 個中の x 番目の文字列を指します。  また、   str[x][y]  は、N 個中の x 番目の文字列の中の、y 番目の文字を指します。

ketchappt
質問者

お礼

とても参考になりました! どうも有難うございます!!

すると、全ての回答が全文表示されます。
回答No.3

> 行単位でデータを参照したい場合は、いい方法はありますでしょうか? char* str = (char*)malloc(sizeof(char)*1024*N); のとき、str+1024*x が第x行の先頭です。

ketchappt
質問者

お礼

ご回答重ねて感謝いたします!

すると、全ての回答が全文表示されます。
  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.2

私なら、 #define N 100 char str[N][1025] ; とか1024では無くて、1025で作ります。 (mallocで領域確保するにしてもです。) なぜかは文字列だから最後の'\0'の1文字を加えてという事です。

ketchappt
質問者

お礼

ご回答とご指摘どうもありがとうございます。Nが可変長である場合、str[x][y]やstr[x]のように参照したい場合はどうしたらよいでしょうか?大変申し訳ございませんが、良かったら教えていただけないでしょうか?よろしくお願いします。

すると、全ての回答が全文表示されます。
回答No.1

char* str = (char*)malloc(sizeof(char)*1024*N); char c = str[x*1024+y]; > 下記Cではやはりうまくいかないのでしょうか? > C:str[x][y] ダメです。

ketchappt
質問者

お礼

早速のご回答どうもありがとうございます。追加で質問させていただきたいのですが、行単位でデータを参照したい場合は、いい方法はありますでしょうか?恐れ入りますが、お時間に余裕がございましたらご教授ください。

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

関連するQ&A