如何正确使用if语句中的malloc()返回值?

时间:2015-01-31 16:07:35

标签: c++ malloc

我想在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); }

2 个答案:

答案 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 ++更多类型安全的运算符取代,因此不鼓励。