0

乱数の動的 3D 配列を生成し、それをメモリ ブロックに割り当てるコード セグメントがあります。私はそれが正しいと思いますが、すべてが連続したメモリブロックにあるかどうかをテストするにはどうすればよいですか? 方法はありますか?各要素のアドレスを画面に出力する cout 関数があり、正しいように見えますが、確信が持てません。メモリも再度解放する必要があることはわかっていますが、それは後で行います。

#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <ctime>

using namespace std;

int main()
{
 int ***dyn_array;
 int **buffer_1;
 int i;
 int j;
 int k;

  int *buffer=new int[5*3*2];//Create a buffer for a block of memory
 dyn_array = new int**[5];
 buffer_1 = new int *[3];

  srand(time(NULL));

  cout<<"The address of the buffer is: "<<buffer<<endl;

 for(i=0;i<5;i++)
 {
  dyn_array[i] = &buffer_1[i*3]; 
    for(j=0;j<3;j++)
    {
     dyn_array[i][j] = &buffer[j*2];
    }
 }


   for(i=0; i<5; i++)
   {
     for(j=0; j<3; j++)
     {
       for(k=0; k<2; k++)
       {
      dyn_array[i][j][k]=rand()%40;
          cout<<"dyn array ["<<i<<"]["<<j<<"]["<<k<<"] is: "<<dyn_array[i][j][k]<<endl;
          cout<<"Memory Address is: "<<&dyn_array[i][j][k]<<endl;
       }
     }
    }
 return 0;
}
4

2 に答える 2

2

すべてが連続したメモリ ブロックに配置されているかどうかをテストするにはどうすればよいですか?

new int[5*3*2];が例外をスローせず、0 を返さなかった場合は、連続したメモリ ブロックが割り当てられています。

于 2012-04-04T13:35:51.103 に答える
1

最初にいくつかのこと:

buffer_1 = new int *[3];
for(i=0;i<5;i++) {
  dyn_array[i] = &buffer_1[i*3];
  ...
}

buffer_1(要素0、1、2)の3つの整数ポインタにメモリを割り当てていますが、ループでは要素0、3、6、9、12にアクセスします(実際には、これらの割り当てられていない要素のアドレスを取得しますが、次に、直後にループ内でそれらにアクセスします)範囲外の要素へのアクセスは定義されていない動作です

また、主な質問に答えるために、言語は、配列を(静的または動的に)割り当てるときに、要素が連続したメモリブロックを占有することを保証します。そうしないと、ポインタ演算( `int * p = new int [2]; *(p + 1)= 5;)は機能しません。

コメントからの更新:

多次元配列効果を実現するには、int *buffer=new int[5*3*2];宣言を使用するのが最も簡単な方法です。30個の要素にメモリを割り当てます。インデックスを作成するには、を使用できますbuffer[i*3*2+j*2+k]=n。ここ0<=i<50<=j<3、、、0<=k<2およびnは整数です。配列を静的に割り当てる場合(int buffer[5][3][2];)、内部インデックスメカニズムは同じになります。

const int MAX_DIM1=5;また、生の数値(別名マジックナンバー)の代わりに名前付き定数(例)を使用すると、コードがより保守しやすくなります

于 2012-04-04T13:42:23.383 に答える