ошибка сегментации — как выделить память для трехмерного массива с помощью calloc в переполнении стека

Я хочу выделить память для 3d-массива в C ++ один за другим, как ..

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));
}
}
}

Я использовал этот код, но я получаю ошибку сегментации ..

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");
}
}
0

Другие решения

Написать

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 ) );
}
}
1

Вы уже выделили память, когда писали

slotstruct slot1[3][100][1500]

Вы хотели написать следующее?

slotstruct ***slot1
-1