2011-01-11 20 views
0

2次元配列の2次元配列を初期化する関数をいくつか呼び出しています。最初の3回の呼び出しは成功しますが、4回目の呼び出しは失敗します。コードは次のとおりです。2次元配列の2倍の初期化に失敗しました

double **scmass; 
double **scdv; 
double **dvmatches; 
double **zpp; 

...

scmass = init_d2darr(numrow,numcol); 
scdv = init_d2darr(numrow,numcol); 
dvmatches = init_d2darr(numrow,numcol); 
zpp = init_d2darr(numrow,numcol); 

...

double ** init_d2darr(int isize, int jsize) { 
int m,n; 
printf("in array initialize 1\n"); 
printf("isize: %i\njsize: %i\n",isize,jsize); 
/* how many rows */ 
double **arr = (double **)malloc(sizeof(double *) * isize); 
printf("after row initialization\n"); 
if (arr == NULL) { 
    printf("malloc failed for arr in init_d2darr.\n"); 
    return NULL; 
} 
else { 
    /* now how many cols */ 
    for (m=0; m<=isize; m++) { 
     arr[m] = (double *)malloc(sizeof(double) * jsize); 
     if (arr[m] == NULL) { 
      printf("malloc failed for arr[%d] in init_d2darr.\n",m); 
      return NULL; 
     } 
     else { 
      /* initialize all to zero */ 
      for (n=0; n<jsize; n++) { 
       arr[m][n] = 0; 
      } 
     } 
    } 
} 
printf("in array initialize 2\n"); 
return arr; 

出力は次のようになります。

in array initialize 1 
isize: 20 
jsize: 21 
after row initialization 
in array initialize 2 
in array initialize 1 
isize: 20 
jsize: 21 
after row initialization 
in array initialize 2 
in array initialize 1 
isize: 20 
jsize: 21 

プログラムが実際に通じたときにすべての方法を実行しますしかし、デバッグモードでは、私がリリース実行可能ファイルを作るときにそれを実行しようとすると、プログラムがクラッシュし、エラーが発生します。「プログラムが正常に動作しなくなる問題が発生しました。 。。?!のプログラムを閉じてください」私は、Visual C++ 2008 Express Editionを持つWindows Vista上だ、誰もが私に何かアドバイスを与えることができるおかげで

ジェイド

編集:(ヘッダー・ファイル内の)関数の宣言

double ** init_d2darr(int isize, int jsize); 

答えて

0

:。

for (m=0; m <= isize; m++) 

が、これは次のようになります。

for (m=0; m < isize; m++) 
+0

ええ、私はそれを見ましたが、なぜそれはそれは第四コール(または任意の呼び出し)にクラッシュするだろうか?アレイに余分な場所を与えてくれるのではないでしょうか? – Jade

+0

ああ、待っています。私はisizeに最初の次元の大きさを設定しますが、次にisize + 1の位置にアクセスして初期化しようとしています。これは私のハードドライブが占有されていると想定していますので上書きしたくありません。ありがとう! – Jade

0
class double_array { 
    double* arr; 
    int arrsize; 
public: 
    double_array(int newsize) { 
     arr = new double[newsize]; 
     arrsize = newsize; 
     for(int i = 0; i < arrsize; i++) 
      arr[i] = 0; 
    } 
    double_array(const double_array& other) { 
     arr = new double[arrsize = other.arrsize]; 
     for(int i = 0; i < arrsize; i++) 
      arr[i] = other.arr[i]; 
    } 
    double& operator[](int index) { 
#ifdef _DEBUG 
     if (index >= arrsize) 
      throw std::runtime_error("Attempted to access array out of bounds!"); 
#endif 
     return arr[index]; 
    } 
    const double& operator[](int index) const { 
#ifdef _DEBUG 
     if (index >= arrsize) 
      throw std::runtime_error("Attempted to access array out of bounds!"); 
#endif 
     return arr[index]; 
    } 
    int size() { 
     return arrsize; 
    } 
    ~double_array() { 
     delete[] arr; 
    } 
}; 
std::vector<double_array> scmass(numrows, numcols); 
std::vector<double_array> scdv(numrows, numcols); 
std::vector<double_array> dvmatches(numrows, numcols); 
std::vector<double_array> zpp(numrows, numcols); 

簡単であるため、ループあなたの外で