我想将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);
}
问题是运算符优先级,适用于 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>
以避免手动分配内存。
不要在C++中使用malloc()
,改用new [type]
其中 [type] 是你分配的类型。
此外,请尽可能使用类类型,因为这将为您节省大量内存管理。
正如另一个答案所述,您应该记住,赋值运算符的优先级比大多数其他运算符低得多;使用()
强制优先级,建议您不要在条件中进行赋值,这会使代码变得混乱。
注意:虽然在这种情况下可以使用malloc
,但在大多数情况下通常首选new
因为new
调用类的构造函数(如果有)。在C++代码中使用malloc
的主要原因是如果要使用 realloc
更改分配的内存的大小。这些函数是原始 C 库的一部分,已被C++更多类型安全的运算符取代,因此不建议使用。