【问题标题】:Casting malloc to a primitive type将 malloc 转换为原始类型
【发布时间】:2017-04-16 23:53:24
【问题描述】:

这在 C 中是如何允许的?

int p= (int) malloc (sizeof(int));

我只在 gcc 中编译时收到警告。

警告:从指针转换为不同大小的整数 [-Wpointer-to-int-cast]

void 指针不能转换为原始类型,对吧?

*((int*)(x))//is allowed - assume x is of type void*

但是如何也允许直接转换为原语?

【问题讨论】:

  • 其实可以投的。
  • 是的。允许这样做,以便您可以将指针投射到intptr_t or uintptr_t
  • @LưuVĩnhPhúc:将指针转换为整数类型的能力早于 intptr_tuintptr_t 的存在。
  • C 允许很多可能是不好的做法。该语言取决于程序员知道他们在做什么。

标签: c pointers casting malloc


【解决方案1】:

这不是禁止的,而是实现定义的行为。引用C11,第 6.3.2.3 章

任何指针类型都可以转换为整数类型。除先前规定外, 结果是实现定义的。如果结果不能用整数类型表示, 行为未定义。结果不必在任何整数的值范围内 输入。

这就是编译器发出警告的原因。

也就是说,引用第 7.20.1.4 章,能够保存对象指针的整数类型,我们有 intptr_tuintptr_t

以下类型指定一个有符号整数类型,其属性是任何有效的 指向 void 的指针可以转换为这种类型,然后再转换回指向 void 的指针, 结果将等于原始指针:

intptr_t

以下类型指定一个无符号整数类型,其属性是任何有效的 指向 void 的指针可以转换为这种类型,然后再转换回指向 void 的指针, 结果将等于原始指针:

uintptr_t


话虽如此,为了完整起见,让我补充一下,there is fair amount of reasons on why not to cast the return value of malloc() and family in C.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-19
    • 2013-01-12
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    相关资源
    最近更新 更多