我想在if
函数中使用malloc()
语句。
我有这段代码:
if(uint16_t *buf = (uint16_t *) malloc(data_len*2) == NULL) exit(1);
但我收到错误:
error: cannot convert 'bool' to 'uint16_t*' in assignment
我错了还是我必须更改代码?
这是带括号等的原始代码:
if ((data = malloc(data_len)) == NULL ||
(buf = malloc(data_len*2)) == NULL) {
exit(1);
}
答案 0 :(得分:3)
问题是运算符优先级,并且适用于C和C ++。等于运算符==
的优先级高于赋值=
,因此您的条件表达式被解析为
uint16_t *buf = ( (uint16_t *) malloc(data_len*2) == NULL)
LHS上有uint16_i*
,RHS上有bool
。看起来你想要的是
(uint16_t *buf = (uint16_t *) malloc(data_len*2)) == NULL
顺便说一句,请注意,不需要在C中转换malloc
(因为问题标记为C)。
在C ++中,您应该认真考虑使用std::vector<uint16_t>
来避免手动内存分配。
答案 1 :(得分:1)
不要在C ++中使用malloc()
,而是使用new [type]
而不是[type]是您分配的类型。
此外,尽可能使用类类型,因为这样可以节省大量内存管理。
正如另一个答案所述,您应该记住,赋值运算符的优先级低于大多数其他运算符;使用()
来强制优先级,建议您执行不在conditinals中进行分配,这会使代码变得混乱。
注意:虽然在这种情况下可以使用malloc
,但在大多数情况下通常首选new
,因为new
会调用类的构造函数(如果有)。在C ++代码中使用malloc
的主要原因是,如果要使用realloc
更改已分配内存的大小。这些函数是原始C库的一部分,并且已被C ++更多类型安全的运算符取代,因此不鼓励。