如何在 if 语句中正确使用 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); }

问题是运算符优先级,适用于 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++更多类型安全的运算符取代,因此不建议使用。

相关内容

  • 没有找到相关文章

最新更新