структура — недопустимое преобразование из void * в strcut * в переполнении стека

когда я пытаюсь использовать 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];
}
}
}
}

-4

Решение

Язык C позволяет неявное преобразование (без приведения) void* на любой другой тип указателя объекта. Это не так в C ++. Ваши варианты:

  • Не компилируйте код C с помощью компилятора C ++ (проще всего).
  • Выполните правильное приведение, чтобы избежать ошибки (дурные тона, часто используются приведения, особенно для начинающих). скрывать проблемы, а не решать их. Злоупотребление ими с этой целью, к сожалению, не редкость. Это, однако, «решит» вашу проблему здесь).
  • использование new[] а также delete[] для вашей последовательности распределения. Приведение не требуется, и если ваш тип данных когда-либо станет нетривиальным, он все равно будет работать.
  • Не используйте ручное распределение памяти совсем, и вместо этого выбрать подход RAII.

Первое из них очевидно, остальные показаны ниже


Используя бросок

Будет работать в этом случае без вредных последствий, потому что ваш 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
3

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

Только для того, что вы спрашиваете: вы должны явно выполнять приведение типа из void * к другим в программах на c ++.

И вы должны рассмотреть возможность использования new а также delete вместо.

0