C言語の質問です。
大きさが可変の二次元配列を作りたいです。
整数Nを入力してもらいその後、
二次元配列 int a[N][N]の中身に数字を入力してもらいたいのですが、配列の宣言時に式には定数値が必要ですといわれできません。
どうすればこのような配列が作れますでしょうか?
malloc,callocを使うやり方は、以降の計算がややこしくなるのでできれば避けたいと思い質問させていただきました。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答8件
0
C99では、可変長配列の機能があります。確保したい場所で配列を宣言してください。
なお、C11ではこの可変長配列の機能はオプショナルになっているので、コンパイラによっては動きません。あと、この配列はスタック上に取られますので、大きなものを作るとスタックオーバーフローします。ご注意ください。
投稿2016/05/26 03:16
総合スコア146544
0
むしろvector<vector<int> >を使うべきじゃないですかね。
サイズも自由ですし。
#include <vector> using namespace std; int N1 = 4; int N2 = 4; vector< vector<int> > a (N1, vector<int>(N2) ); a[0][2] = 1;
こんなんで、自由に使えると思いますが。ソースは手書きなので間違ってたらごめんなさい。
あ、C++ではなくて、C限定でしたら的外れでした。
投稿2016/06/02 03:46
編集2016/06/02 03:47総合スコア210
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
... malloc,callocを使うやり方は、以降の計算がややこしくなる...
int[N][N]の構造を構築しようせずに、 int[NN] の構造を作成することを検討しては如何でしょう。
そして a[x][y] のアクセスは a[xN + y] と置き換えてプログラミンするのです。
(マクロや 関関数化するとよいかもしれません。)
この方法の延長なら、 int[N][M] や int[X][Y][Z] のような多次元配列を動的にメモリー確保するのもそれほど、苦ではなくなると思います。
投稿2016/05/28 11:59
総合スコア22328
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
malloc,callocを使うやり方は、以降の計算がややこしくなるのでできれば避けたいと思い質問させていただきました。
まあそう言わず...
C
1#include <stdio.h> /* printf */ 2#include <stdlib.h> /* malloc/free */ 3 4int main() { 5 int N = 5; 6 int i, j; 7 8 int** a; 9 10 { /* 領域確保と初期化 */ 11 int i; 12 char* p = (char*)malloc(N*sizeof(int*)+N*N*sizeof(int)); 13 a = (int**)p; 14 p += N*sizeof(int*); 15 for ( i = 0; i < N; ++i ) { 16 a[i] = (int*)p; 17 p += N*sizeof(int); 18 } 19 } 20 21 /* write */ 22 for ( i = 0; i < N; ++i ) { 23 for ( j = 0; j < N; ++j ) { 24 a[i][j] = i*100+j; 25 } 26 } 27 28 /* read */ 29 for ( i = 0; i < N; ++i ) { 30 for ( j = 0; j < N; ++j ) { 31 printf("%3d ", a[i][j]); 32 } 33 printf("\n"); 34 } 35 36 /* 領域解放 */ 37 free(a); 38 39}
投稿2016/05/26 06:42
総合スコア16612
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
C言語だと無理です。
計算が面倒、処理が面倒だろうが、先人たちはmallocなどを駆使して処理してきました。
(追記)
失礼しました。
Cの規格によってはできるようですね。
しかし個人的にはできない環境も想定して、mallocを使うことをお勧めします。
投稿2016/05/26 03:11
編集2016/05/26 04:53総合スコア17000
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。