【问题标题】:Check the memory location of a multi-dimensional array C++检查多维数组C++的内存位置
【发布时间】:2012-04-04 13:30:01
【问题描述】:

我有一个代码段,它生成一个随机数的动态 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;
}

【问题讨论】:

  • 您的代码存在一些问题。例如 buffer_1[i*3]: i*3 可以达到 12,但 buffer_1 的大小只有 3。
  • for(i=0;i&lt;5;i++) { dyn_array[i] = &amp;buffer_1[i*3]; 你想在这里做什么? buffer_1 已为 3 个指针分配空间。
  • @Vaughn Cato 我基本上是在尝试将 3D 数组分配给将包含所有元素的缓冲区。我可以用 2D 数组来做,但我认为这是用 3D 数组做的正确步骤

标签: c++ memory-management multidimensional-array


【解决方案1】:

我如何测试它是否都位于一个连续的内存块中?

如果表达式 new int[5*3*2]; 没有引发异常并且没有返回 0,那么您已经分配了一个连续的内存块。

【讨论】:

  • 感谢您的回复,非常感谢。根据我得到的其他答案,我的问题不是连续记忆,而是我索引它的方式。再次感谢
【解决方案2】:

先说几件事:

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;) 将不起作用。

来自 cmets 的更新:

要实现多维数组效果,最简单的方法是使用您的int *buffer=new int[5*3*2]; 声明:它为30 个元素分配内存。要对其进行索引,您可以使用buffer[i*3*2+j*2+k]=n,其中0&lt;=i&lt;50&lt;=j&lt;30&lt;=k&lt;2n 是一个整数。如果您要静态分配数组(int buffer[5][3][2];),内部索引机制将是相同的。

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

【讨论】:

  • 谢谢阿提拉。那么做第一部分的正确方法是什么?我迷失了这些多维数组。我知道向量更容易并且“更好的实践”,但我也必须了解数组
  • int *buffer=new int[5*3*2]; 对你来说已经足够了:它为 30 个元素分配内存。要对其进行索引,您可以使用buffer[i*3*2+j*2+k]=n,其中0&lt;=i&lt;50&lt;=j&lt;30&lt;=k&lt;2n 是一个整数。如果您要静态分配数组int buffer[5][3][2];,则内部索引机制将相同。此外,使用命名常量(例如const int MAX_DIM1=5;)而不是原始数字(又名幻数)——将使您的代码更易于维护
  • 这对我来说很清楚。我一直在努力解决这些问题,但您的回答非常有意义。谢谢。
猜你喜欢
  • 2014-01-07
  • 2013-06-27
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 2019-08-30
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
相关资源
最近更新 更多