【问题标题】:How to use correctly the malloc() return value in if statement?如何正确使用 if 语句中的 malloc() 返回值?
【发布时间】:2015-01-31 16:07:35
【问题描述】:

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

【问题讨论】:

  • 首先,决定一种编程语言。您提到的代码在任何一个中都不好,但是出于不同的原因。也就是说,错误是由评估各种运算符的顺序引起的,这不是您想要的。
  • 添加一对括号if((uint16_t *buf = (uint16_t *) malloc(data_len*2)) == NULL)
  • 如前所述,C++ 中不需要 malloc()。那是 C 的东西。
  • @UlrichEckhardt 原来的 C 代码是这个,buf = malloc(data_len*2)== NULL 我问社区stackoverflow.com/questions/28226016/… 如何在 C++ 中做到这一点。
  • 然后使用 std::vector 。它将使用异常发出分配失败的信号,因此您不会因无用的检查而使代码混乱。也就是说,您应该在 C++ 中使用 static_cast,但其他 cmets 是正确的,首先不要在那里使用 malloc()。顺便说一句:考虑你的版本中buf 的范围!

标签: c++ malloc


【解决方案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> 以避免手动分配内存。

【讨论】:

    【解决方案2】:

    不要在 C++ 中使用 malloc(),而是使用 new [type],其中 [type] 是您分配的类型。

    此外,尽可能使用类类型,因为这样可以节省大量内存管理。

    正如另一个答案所述,您应该记住,赋值运算符的优先级比大多数其他运算符低得多;使用() 强制优先级,建议您不要在条件中进行赋值,这会使代码混乱。

    注意:虽然在这种情况下您可以使用malloc,但在大多数情况下通常首选new,因为new 会调用类的构造函数(如果有的话)。在 C++ 代码中使用malloc 的主要原因是如果您想使用realloc 更改分配内存的大小。这些函数是原始 C 库的一部分,已被 C++ 更多类型安全的运算符取代,因此不鼓励使用。

    【讨论】:

    • 那么new 将如何解决问题?
    • std::string 类为例——它为您省去了手动分配数据的痛苦,而且也是动态的。不过我会把它改成内存管理。
    • 如果他使用 C++,new 调用构造函数; malloc 是一个 C 函数
    • @Isaiah 建议使用 new 是可以的,但如果 OP 需要使用 malloc() 或者只是好奇出了什么问题,那么您的回答并不能回答问题。
    • 那么调用 uint16_t 不存在的构造函数将如何帮助 OP 解决编译器错误?
    猜你喜欢
    • 1970-01-01
    • 2017-09-13
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 2020-02-27
    相关资源
    最近更新 更多