【问题标题】:Does malloc() have a maximum return value?malloc() 是否有最大返回值?
【发布时间】:2015-05-15 10:46:14
【问题描述】:

malloc()返回的虚拟内存指针的size_t值有上限吗?

我想知道我是否可以安全地设置 64 位指针的最高有效位来指示这不是指针而是文字整数。

【问题讨论】:

  • int64_tuint64_t 有什么问题?
  • 这取决于OS'内存映射策略,并且由于该策略是一个实现细节,它可以从OS 的一个版本更改为下一个版本而不会发出任何警告。我不会依赖这样的黑客攻击。
  • 您问题中的某些内容相当不清楚(至少对我而言)。假设您调用了malloc,它返回了一个新分配的内存块的地址。如何更改该值的 MSB 使其“指示文字字符串”。我想你的意思是 - “有没有 malloc 从未返回的值,我可以安全地使用这些值来区分它们与malloc 返回的值?” .也就是说,如果您提供相关的代码片段(即返回指针的函数),这里的某人可能会建议一种干净安全的方法来实现您的目标。
  • 您可以安全地执行此操作,但不是“在 C 中”:您需要完全忘记 C 的抽象语义并阅读您的 硬件 平台的指针规则(如果愿意,您可以用 C 编写代码,但这是一个细节)。 Can be done on x64.

标签: c pointers memory


【解决方案1】:

malloc 返回 void* 而不是整数。将指针转换为整数并不是为您提供(虚拟内存)地址,而是一些必须遵守 C 语言标准中定义的语义的值(0 表示空指针,加减法与指针运算有关) ,但仅此而已。

除此之外,您不得对指针转换为整数的值做任何假设。事实上,C 实现很可能有权将非空指针强制转换为整数,并在高位上添加一些内部信息。

【讨论】:

    【解决方案2】:

    正如@datenwolf 的回答所述,您不能对malloc 如何为您提供内存地址做出任何假设。 MSB 很可能包含您可以覆盖的重要位,如果您尝试使用它们来存储元数据。我曾在一个 32 位系统上工作,该系统返回的地址的位设置在地址的 MSB 中(不是来自 malloc,而是来自其他系统特定的内存分配函数)。

    但是,它保证malloc 将返回一个适合您系统的地址。例如,在 32 位系统上,您将获得一个 4 字节对齐的指针,而在 64 位系统上,您将获得一个 8 字节对齐的指针。这意味着您可以保证低 2 位或 3 位分别为零。您可以改用memalign 来增加保证位数。它本质上与将元数据存储在最高有效位中的效果相同。要获取/设置文字,您可以将其上移/下移到剩余的位。

    但是,我不会建议任何一种方法。为自己省点心痛,并分配更多内存来存储标志。除非你有数十亿,否则真的不值得。

    【讨论】:

    • 不错,这样就可以了。确实,我有数十亿个,我已经解决了这个问题,但我很想知道更多关于 malloc() 的信息。
    【解决方案3】:

    至于size_t,它可以保存limits.h定义的值

    #ifndef SIZE_MAX
    #ifdef _WIN64 
    #define SIZE_MAX _UI64_MAX
    #else
    #define SIZE_MAX UINT_MAX
    

    其中_UI64_MAX和UINT_MAX定义如下。

    #define UINT_MAX      0xffffffff    /* maximum unsigned int value */
    #define _UI64_MAX     0xffffffffffffffffui64 
    

    对于malloc() 而言,在 32 位 Windows 上,它可以返回零到 2 GB 用户模式地址空间内的任何(地址)值,而在 64 位 Windows 上,它可以返回任何(地址)值在 0 到 8 TB 的用户模式地址空间内。

    同样,在 32 位系统上,从 WinNT 4 开始,它引入了引导选项 /3G。这样,malloc() 可以返回零到 3 GB 用户模式地址空间内的任何(地址)值。

    有关更多详细信息,请查看 Mark Russinovich 的文章here

    【讨论】:

      猜你喜欢
      • 2017-09-01
      • 2022-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多