【问题标题】:how to allocate memory for 3D array using calloc in c++如何在 C++ 中使用 calloc 为 3D 数组分配内存
【发布时间】:2017-01-12 17:30:57
【问题描述】:

我想在 c++ 中为 3d 数组一一分配内存,就像..

typedef struct {
int id;int use;
}slotstruct;
slotstruct slot1[3][100][1500];  // This should be 3d array
for(i=0;i<3;i++){
  for(j=0;j<100;j++){
     for(k=0;k<1500;k++){
         slot1[i][j][k] = (slotstruct *)calloc(1,sizeof(slotstruct));
      }
   }
}

我已经使用了这段代码,但是我遇到了分段错误..

【问题讨论】:

  • 你对数组有错误的想法,但是,这段代码不会给你分段错误。此代码根本无法编译,即使包装在具有所有必需声明和包含的函数中也是如此。发布您的真实代码。
  • 恐怕你所说的 C++ 实际上是 C。还有一些旧标准。
  • @Bob__ 这只是我项目的一小部分。我的整个项目都是用 c++ 编写的,所以通过这个小代码你将无法区分
  • @michalsrb 在我的项目中,每个光束有 3 个光束,有 100 个通道,每个通道有 1500 个插槽,所以在主要乐趣中我将调用此方法来分配内存..
  • 您是否考虑过使用具有一维 std::vector 和自定义访问器的类?

标签: c++ segmentation-fault dynamic-allocation calloc


【解决方案1】:

先计算所需的内存总量,然后先为主数组和子数组分配内存,如下所示。它不会导致分段错误。 即使您可以检查地址,它们也是连续的。 试试下面的代码,它对我来说很好:

typedef struct
{
int id;
int use;
}slotstruct;

main()
{
        int i,j,k;
        char row=2 ,col =3, var=3;
        //char **a=(char**)malloc(col*sizeof(char*));
        slotstruct*** a =(slotstruct***)calloc(col,sizeof(slotstruct*));

        for(i=0;i<col;i++)
                a[i]=(slotstruct**)calloc(row,sizeof(slotstruct*));

        for(i=0;i<col;i++)
                for(j=0;j<row;j++)
                        a[i][j]=(slotstruct*)calloc(var,sizeof(slotstruct*));


        int cnt=0;
        for( i=0;i<col;i++)
                for( j=0;j<row;j++)
                {
                        for(k=0;k<var;k++)
                                a[i][j][k].id=cnt++;
                }

        for(i=0;i<col;i++)
                for(j=0;j<row;j++)
                {
                        for(k=0;k<var;k++)
                                printf("%d ",a[i][j][k].id);
                                printf("%u ",&a[i][j][k]);
                        printf("\n");
                }
}

【讨论】:

  • 如果以这种方式分配,则不能保证地址是连续的。您还应该记得在退出之前释放内存。
  • 是的,我也需要释放内存。
  • @Stubborn 为什么你使用 sizeof(int*) 我无法理解。!
  • @nim 搞错了。
【解决方案2】:

slotstruct ( *slot1 )[100][1500];

slot1 = calloc( 1, 3 * sizeof( *slot1 ) ); 

或者试试下面的方法

slotstruct ***slot1;

slot1 = malloc( 3 * sizeof( slotstruct ** ) );

for ( int i = 0; i < 3; i++ )
{ 
    slot1[i] = malloc( 100 * sizeof( slotstruct * ) );
    for ( int j = 0; j < 100; j++ )
    {
        slot1[i][j] = calloc( 1, 1500 * sizeof( slotstruct ) );
    }
}

【讨论】:

  • 这不符合我的要求.. 当我使用 thid 代码 sn-p 打印地址时,我得到的地址是这样的。 16135008 , 161350016 , 161350024 , 16137024 而我需要 5008,50016,50024,50032,50040,50048
  • @nlm 你已经尝试过第二个 sn-p,第一个呢?
  • 我想动态分配..我认为第一种方法是静态分配方式。
  • @nlm 两种显示的方法都动态分配内存。
  • 第一个是动态的,但不是一个一个的..三个条件要满足一个一个分配+动态+连续..
【解决方案3】:

你写的时候已经分配了内存

slotstruct slot1[3][100][1500]

您的意思是写以下内容吗?

slotstruct ***slot1

【讨论】:

  • 是的.. 但我不知道如何使用 ***slot1 进行分配。它应该是连续的并且一个接一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 2020-06-23
  • 2020-10-23
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
相关资源
最近更新 更多