- ベストアンサー
メモリ領域の確保の仕方
あまりうまく書けなかったのですがよろしくお願いします。 ファイルから二次配列を読み込むプログラムを作ろうとしました。 /*****行列Aに値を入れる********/ for(i = 0; i < Qap->iN; i++){ for(j = 0; j < Qap->iN; j++){ fscanf(fp, "%d", &Qap->matrixA[i][j]); } } /*****行列Bに値を入れる********/ for(i = 0; i < Qap->iN; i++){ for(j = 0; j < Qap->iN; j++){ fscanf(fp, "%d", &Qap->matrixB[i][j]); } } のように書くために、二次配列の領域を確保しようとしたとき、 #define SIZE 100 //行列のサイズ typedef struct hairetu{ int iN; int matrixA[SIZE][SIZE]; int matrixB[SIZE][SIZE]; }hairetu; としてmatrixA[SIZE][SIZE]のようにした場合は Qap = malloc(sizeof(hairetu));//hairetu分の大きさの領域を確保 とすれば領域を確保できたのですが、 typedef struct hairetu{ int iN; int **matrixA; int **matrixB; }hairetu; のように二次配列を**matrixAと表そうとして、 fscanf(fp, "%d", &Qap->iN); のようにファイルから行列のサイズを読み込もうとした場合、 Qap = malloc(sizeof(hairetu));//hairetu分の大きさの領域を確保 とやってもコンパイルはできるのですがアプリケーションエラーが出てしまいます。 何故だかよくわかりません。 二次配列を**matrixAのように表そうとした場合の領域確保の仕方を教えて下さい。 わかりづらくて本当に申し訳ありませんがお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
こんな方法もあります。 連続したメモリ領域をまとめて確保できるのがちょっと嬉しいです。 タブの代わりに全角スペースを入れているので気をつけてください。 int n = 10; // 動的に確保するので定数でなくてもよい int i, j; int **a; // n*n の(似非)二次元配列を確保 a = (int**)malloc(sizeof(int*)*n); a[0] = (int*)malloc(sizeof(int)*n*n); for (i=1 ; i<n ; i++) { a[i] = a[i-1] + n; } // 使う for (i=0 ; i<n ; i++) { for (j=0 ; j<n ; j++) { a[i][j] = 1; } } // 解放 free(a[0]); free(a);
その他の回答 (4)
- nagare
- ベストアンサー率33% (280/831)
二次元配列でしたね Qap = malloc(sizeof(hairetu)); matrixAWork=malloc(sizeof(int)*SIZE*SIZE); matrixBWork=malloc(sizeof(int)*SIZE*SIZE); Qap->matrixA = &matrixAWork; Qap->matrixB = &matrixBWork; に訂正させていただきます
お礼
わざわざありがとうございます。
- nagare
- ベストアンサー率33% (280/831)
読み込んだデータはどこへ格納するのでしょうか?? これが答えです 領域の確保と設定は Qap = malloc(sizeof(hairetu)); matrixAWork=malloc(sizeof(int)*SIZE); matrixBWork=malloc(sizeof(int)*SIZE); Qap.matrixA = &matrixAWork; Qap.matrixB = &matrixBWork; となります でも fscanf(fp, "%d", &Qap->matrixA[i][j]); が使えなくなるため typedef struct hairetu{ int iN; int *matrixA; int *matrixB; }hairetuQap = malloc(sizeof(hairetu)); matrixAWork=malloc(sizeof(int)*SIZE); matrixBWork=malloc(sizeof(int)*SIZE); Qap.matrixA = matrixAWork; Qap.matrixB = matrixBWork; がよいでしょう
お礼
丁寧な回答ありがとうございます。 このようにして配列の分も別に領域を確保するのですね。 どうもありがとうございます。
- hofuhofu
- ベストアンサー率70% (336/476)
**matrixの領域も別に確保する必要があります。 そのまま使ってしまうと当然メモリ破壊が起きてしまいます。 Qap = (hairetu*)malloc(sizeof(hairetu)); Qap->matrixA = (int**)malloc(sizeof(int*) * SIZE); for(i = 0; i < SIZE; i++) Qap->matrixA[i] = (int*)malloc(sizeof(int) * SIZE); freeも忘れずに。 1つめに合わせてQapはhairetu*型にしましたが、 typedef struct hairetu{ int iN; int **matrixA; int **matrixB; }hairetu; では、**matrixの容量を確保しない限りそれほどメモリを必要としないので、そのままhairetu型にしてみいいと思います。
お礼
Qap->matrixA = (int**)malloc(sizeof(int*) * SIZE); for(i = 0; i < SIZE; i++) Qap->matrixA[i] = (int*)malloc(sizeof(int) * SIZE); **matrixの領域も別に確保する必要があるということですね。 どうもありがとうございます。
- osamuy
- ベストアンサー率42% (1231/2878)
typedef struct hairetu{ int iN; int **matrixA; int **matrixB; } hairetu; ――だと、構造体は、数値型 + ポインタ型 + ポインタ型の形になりますので、これをmallocしても、実際の二次元配列のメモリは確保されません。 別途mallocして、ポインタに代入する必要があります。
お礼
どうもありがとうございます。大変参考になりました。 頑張ってみます。
お礼
ご回答ありがとうございます。 全く考え付かなかった方法です。 この方法を使ってみたら何とか動かすことができました。本当にどうもありがとうございました。