1次元配列を使って2次元配列を作る方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
田代

1次元配列を使って2次元配列を作る方法

#1

投稿記事 by 田代 » 15年前

1次元配列を使って、2次元配列を作る方法について
お尋ねします。
下記のようなポインタのポインタを使った2次元配列が
あるとします。

int i;
double **array;
array = (double**)calloc(3000, sizeof(double*));
for(i=0;i<3000;i++){
*(array+i) = (double*)calloc(3000, sizeof(double));
}

これを、callocを使った1次元配列で表現するには
どうすればよいのでしょうか?
上記にあるように、3000くらいの大きさで計算可能にするには、
Segmentation falutを避ける為、どうしても1次元にて表現する必要があるようなのです。

素人な質問で大変恐縮ですが、何卒よろしくお願いします!

Justy

Re:1次元配列を使って2次元配列を作る方法

#2

投稿記事 by Justy » 15年前


> >Segmentation falutを避ける為、どうしても1次元にて表現する必要があるようなのです

 ここの意味がよくわかりませんでした。
 1次元だとどうしてそれが回避できるのでしょうか?



> これを、callocを使った1次元配列で表現するには
> どうすればよいのでしょうか?

 んー、こんな感じですか?
[color=#d0d0ff" face="monospace]
const int column = 3000, row = 3000;
double **p = (double **)calloc(1, column * row * sizeof(double) + column * sizeof(double *));
if(p)
{
int n;
double *pData = (double *)(p + column);
for(n=0; n<column; ++n)
p[n] = pData + row * n;

// この段階で p[0][0]~p[column-1][row-1]までアクセスできる

free(p);
}
[/color]

box

Re:1次元配列を使って2次元配列を作る方法

#3

投稿記事 by box » 15年前

> 上記にあるように、3000くらいの大きさで計算可能にするには、
> Segmentation falutを避ける為、どうしても1次元にて表現する必要があるようなのです。

sizeof(double)*3000*3000 という大きさの領域を
1次元配列とみなすか2次元配列とみなすか、という違いだけの話です。

2次元配列とみなそうとして、その大きさの領域を確保しようとするときに
segmentation faultが起きるなら、1次元配列とみなそうとするときも同じ結果です。

確保しようとする領域の大きさが同じであるならば、
それを2次元配列とみなそうとするとsegmentation faultが起きて、
1次元配列とみなそうとすると起きない、ということはありません。

segmentation faultが起きるとするならば、その理由は
確保した領域の外側にアクセスしようとした、というような、
動的確保とは全く別の話ではないでしょうか。

閉鎖

“C言語何でも質問掲示板” へ戻る