когда я пытаюсь использовать calloc для непрерывного выделения памяти, это дает мне ошибку, как ..
неправильное преобразование из void * в slotstruct (*) [100] [1500] в c ++
вот мой код:
typedef struct
{
int id;
bool used;
}slotstruct;
int main(){
slotstruct ( *slot1 )[100][1500];
slot1 = calloc( 1, 3 * sizeof( *slot1 ) );
for(i=0;i<3;i++){
for(j=0;j<100;j++){
for(k=0;k<1500;k++){
cout << "Addresses are : "<<slot1[i][j][k];
}
}
}
}
Язык C позволяет неявное преобразование (без приведения) void*
на любой другой тип указателя объекта. Это не так в C ++. Ваши варианты:
new[]
а также delete[]
для вашей последовательности распределения. Приведение не требуется, и если ваш тип данных когда-либо станет нетривиальным, он все равно будет работать. Первое из них очевидно, остальные показаны ниже
Используя бросок
Будет работать в этом случае без вредных последствий, потому что ваш slotstruct
тип тривиален:
slot1 = (slotstruct (*)[100][1500])calloc( 1, 3 * sizeof( *slot1 ) ); // allocates
free(slot1); // destroys
С помощью new[]
(а также delete[]
)
Не требуется литье:
slot1 = new slotstruct[3][100][1500]; // allocates..
delete [] slot1; //.. destroys
C ++ Альтернативное использование RAII
Более правильный подход C ++ RAII для того, что вы пытаетесь выполнить, выглядит следующим образом:
#include <iostream>
#include <array>
#include <vector>
struct slotstruct
{
int id;
bool used;
};
int main()
{
std::vector<std::array<std::array<slotstruct,1500>, 100>> slots(3);
for (auto const& x : slots)
for (auto const& y : x)
for (auto const& z : y)
std::cout <<"Address is : " << static_cast<const void*>(&z) << '\n';
}
Выход (варьируется)
Address is : 0x100200000
Address is : 0x100200008
Address is : 0x100200010
Address is : 0x100200018
Address is : 0x100200020
...
Address is : 0x10056ee60
Address is : 0x10056ee68
Address is : 0x10056ee70
Address is : 0x10056ee78
Только для того, что вы спрашиваете: вы должны явно выполнять приведение типа из void * к другим в программах на c ++.
И вы должны рассмотреть возможность использования new
а также delete
вместо.