当我尝试使用calloc进行连续内存分配时,它给出了我的错误... 在c ++中无效转换为void *到slotstruct(*)[100] [1500]
这是我的代码:
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];
}
}
}
}
答案 0 :(得分:3)
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
使用RAII
的C ++替代方案对于您似乎想要实现的目标,更合适的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
答案 1 :(得分:0)
仅针对您的要求:您应该在c ++程序中明确地执行从void *到其他人的类型转换。
您应该考虑使用new
和delete
代替。