我正在尝试用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.
答案 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)
*buff
是bitData
类型的左值。你不能指定一个指针。
在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
并在分配内存时进行类型转换。上面的代码将被编译,没有任何错误或警告。