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次元にて表現する必要があるようなのです。
素人な質問で大変恐縮ですが、何卒よろしくお願いします!
1次元配列を使って2次元配列を作る方法
Re:1次元配列を使って2次元配列を作る方法
> >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]
Re:1次元配列を使って2次元配列を作る方法
> 上記にあるように、3000くらいの大きさで計算可能にするには、
> Segmentation falutを避ける為、どうしても1次元にて表現する必要があるようなのです。
sizeof(double)*3000*3000 という大きさの領域を
1次元配列とみなすか2次元配列とみなすか、という違いだけの話です。
2次元配列とみなそうとして、その大きさの領域を確保しようとするときに
segmentation faultが起きるなら、1次元配列とみなそうとするときも同じ結果です。
確保しようとする領域の大きさが同じであるならば、
それを2次元配列とみなそうとするとsegmentation faultが起きて、
1次元配列とみなそうとすると起きない、ということはありません。
segmentation faultが起きるとするならば、その理由は
確保した領域の外側にアクセスしようとした、というような、
動的確保とは全く別の話ではないでしょうか。
> Segmentation falutを避ける為、どうしても1次元にて表現する必要があるようなのです。
sizeof(double)*3000*3000 という大きさの領域を
1次元配列とみなすか2次元配列とみなすか、という違いだけの話です。
2次元配列とみなそうとして、その大きさの領域を確保しようとするときに
segmentation faultが起きるなら、1次元配列とみなそうとするときも同じ結果です。
確保しようとする領域の大きさが同じであるならば、
それを2次元配列とみなそうとするとsegmentation faultが起きて、
1次元配列とみなそうとすると起きない、ということはありません。
segmentation faultが起きるとするならば、その理由は
確保した領域の外側にアクセスしようとした、というような、
動的確保とは全く別の話ではないでしょうか。