2016-09-05 4 views
1

Я хочу, чтобы выделить память для 3d массива в C++ один за другим, как ..как выделить память для 3D-массива с помощью calloc в 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)); 
     } 
    } 
} 

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

+2

Вы неверное представление о массивах, тем не менее, этот код не будет давать вам сегментации вины. Этот код вообще не будет компилироваться, даже если он включен в функцию со всеми необходимыми декларациями и включает в себя. Отправьте свой реальный код. – michalsrb

+1

Я боюсь, что то, что вы называете C++, это на самом деле C. Пара стандартов тоже старая. –

+0

@Bob__ это всего лишь небольшая часть моего проекта .. весь мой проект находится в C++, поэтому этим небольшим кодом вы не сможете отличить – nlm

ответ

0

Вычислить общий объем памяти, необходимый первыми затем выделить память первой для основного массива и вспомогательных массивов, как ниже. Это не приведет к сбою сегментации. Даже вы можете проверить адреса также они смежные. Попробуйте ниже код он отлично работает для меня:

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

Адреса не гарантируются, если они выделены таким образом. Вы должны также забыть освободить память перед выходом. –

+1

Да, мне также нужно освободить память. – Stubborn

+0

@ Упрямый, почему вы использовали sizeof (int *), я не могу понять.! – nlm

-1

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

slotstruct slot1[3][100][1500] 

вы имели в виду, чтобы написать следующее?

slotstruct ***slot1 
+0

да .. но я не знаю, как распределить, используя *** slot1. он должен быть смежным и один за другим. – nlm

+0

Проверьте ответ vlad для того, как это сделать с помощью тройного указателя. – kaustubh

1

Написать

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

это не соответствует моему требованию .. когда я печатаю адреса, используя код снизу кода, я получаю адреса. 16135008, 161350016, 161350024, 16137024, в то время как мне нужно как 5008,50016,50024,50032,50040,50048 – nlm

+0

@nlm вы пробовали второй сниппет, а как насчет первого? –

+0

Я хочу выделить динамически .. Я думаю, что первый метод будет статическим способом выделения. – nlm