不能转换不完整类型的论点' void *' to' const bitData'

时间:2016-10-21 08:09:04

标签: c++ c

我正在尝试用c ++创建一个位数组,当我创建一个单独的变量时它就可以工作。但是,当我尝试从中创建数组时,我无法弄清楚如何修复此错误。

typedef struct bitData
{
      unsigned bit:1;
} bitData;

int main() {
  bitData* buff;
  *buff = malloc(3 * sizeof(struct bitData));
  buff[0].bit = 1;
  buff[1].bit = 0;
  buff[2].bit = 1;

  for (int i = 0; i < 3; ++i)
  {
    printf("buff[%d] = %d\n",i , buff[i].bit);
  }
}

这是错误:

$ g++ main.cpp 
main.cpp:23:9: error: no viable overloaded '='
  *buff = malloc(3* sizeof(struct bitData));
  ~~~~~ ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:12:16: note: candidate function (the implicit copy assignment operator) not viable: cannot convert argument of incomplete type 'void *' to 'const bitData'
typedef struct bitData
          ^
1 error generated.

3 个答案:

答案 0 :(得分:3)

您的代码中存在拼写错误。你的指针变量前面的*需要去,你不想在这里取消引用它,你要分配给它。

在C:

int main() {
  bitData* buff;
  buff = malloc(3 * sizeof(struct bitData));

在可怕的C / C ++混合中:

int main() {
  bitData* buff;
  buff = (bitData*)malloc(3 * sizeof(struct bitData));

在C ++中:

int main() {
  bitData* buff = new bitData[3];

答案 1 :(得分:2)

*buffbitData类型的左值。你不能指定一个指针。

在C中,你可以这么说:

buff = malloc(3* sizeof(struct bitData));

在C ++中,您无法直接将void*分配给T*,您需要将其投射:

buff = static_cast<bitData*>(malloc(3* sizeof(struct bitData)));

虽然如果你正在使用C ++,你应该使用new而不是malloc,或者更好的是容器/智能指针,以避免手动管理内存。

如果您希望这部分代码与C和C ++兼容,请使用C风格的强制转换(确保您确实需要这样做):

buff = (bitData*)malloc(3* sizeof(struct bitData));

答案 2 :(得分:0)

只需更改下面的代码,然后尝试:

typedef struct bitData
{
      unsigned bit:1;
} bitData;

int main() {
  bitData* buff;
  buff = (bitData*)malloc(3 * sizeof(struct bitData));
  buff[0].bit = 1;
  buff[1].bit = 0;
  buff[2].bit = 1;

  for (int i = 0; i < 3; ++i)
  {
    printf("buff[%d] = %d\n",i , buff[i].bit);
  }
}

删除*之前的buff并在分配内存时进行类型转换。上面的代码将被编译,没有任何错误或警告。