我有一个代码段,可以生成一个随机数的动态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;
}
答案 0 :(得分:2)
如何测试它是否全部位于连续的内存块中?
如果表达式new int[5*3*2];
没有抛出异常并且没有返回0,那么你已经分配了一个连续的内存块。
答案 1 :(得分: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<2
和n
是一个整数。如果要静态分配数组(int buffer[5][3][2];
),内部索引机制将是相同的。
此外,使用命名常量(例如const int MAX_DIM1=5;
)而不是原始数字(又称幻数) - 将使您的代码更具可维护性