【问题标题】:What is the difference between passing sbrk() an intptr_t vs int in C在 C 中传递 sbrk() 和 intptr_t 与 int 有什么区别
【发布时间】:2011-07-19 08:06:51
【问题描述】:

它似乎对 sbrk 的功能没有影响,但是在 sbrk() 的文档中它说它需要一个 intptr_t 参数。

当将 int 类型作为参数传递时,它可以工作(或至少看起来可以工作)。

这是在常规 C 中。

【问题讨论】:

    标签: c sbrk


    【解决方案1】:

    intptr_t 根据架构改变大小。 int 可能会也可能不会根据架构改变大小 - 也就是说,如果您使用 64 位,那么 intptr_t 必须是 64 位,而 int 可能是 32 位。

    【讨论】:

    • intptr_t 不是指针,不是实际值吗?所以在 sbrk() 中会取消引用 intptr_t,而如果你传递一个 int,则不需要取消引用。
    • @Bob intptr_t 是整数类型,是可以包含指针所有位的最小类型。
    • 哦,有道理!出于某种原因,我认为这是一个指针.. 感谢您的澄清。 “指针的所有位”的意义是什么?这是否意味着从机器到机器,指针所需的位会发生变化,intptr_t 的大小也会发生变化?
    • @Bob 好吧,它会“从平台到平台”发生变化。大多数人拥有的 amd64 处理器可以在 32 位兼容模式(32 位指针)或 64 位模式下工作。大多数操作系统甚至允许 32 位进程和 64 位进程共存。但是在编译 C 程序时,您要么以一种模式为目标,要么以另一种模式为目标。
    【解决方案2】:

    只要包含正确的标题,您就不会将int 传递给sbrk()。您传递的值将根据 C 提升规则转换为 intptr_t。这些规则非常微妙,因此您至少应该知道它们存在并避免在极端情况下调用它们。

    因此,当您传递sbrk 时,即使intptr_t 与您平台上的int 不同,也不要期望发生诸如崩溃之类的惊人事件,只要包含提供sbrk() 原型的标头即可。

    【讨论】:

    • 所以当你向 sbrk() 传递一个 'int' 时,它会存储这个值并传递一个带有 int 位置的 intptr_t?
    • @Bob 不,促销规则不这样做。 intptr_t 也是整数类型,只是并不总是与 int 相同。
    猜你喜欢
    • 1970-01-01
    • 2010-09-12
    • 2012-08-30
    • 2014-06-12
    • 2021-01-05
    • 2023-03-14
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多