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)的三个整数指针分配内存,但在循环中您访问元素 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<5, 0<=j<3,0<=k<2n是一个整数。如果您要静态分配数组 ( int buffer[5][3][2];),内部索引机制将是相同的。

此外,使用命名常量(例如const int MAX_DIM1=5;)而不是原始数字(又名幻数)——将使您的代码更易于维护

于 2012-04-04T13:42:23.383 回答