在c ++中无效转换为void *到strcut *

时间:2016-09-09 04:59:45

标签: c++ structure calloc

当我尝试使用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];
           }
      }
    }
 } 

2 个答案:

答案 0 :(得分:3)

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

使用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 *到其他人的类型转换。

您应该考虑使用newdelete代替。