【问题标题】:Can one malloc call be used to allocate two arrays?一个 malloc 调用可以用来分配两个数组吗?
【发布时间】:2020-02-18 02:14:55
【问题描述】:

如果我知道 T 和 U 类型也有相同的对齐方式,我可以像这样使用一个 malloc 调用吗:

void* allocate_memory(int n, int m) {
  return malloc(sizeof(T) * n + sizeof(U) * m);
}

为这两种类型的数组分配连续的内存?

如果没问题,获取指向第二个数组第一个元素的指针的正确方法是什么?转换 void* -> char* -> (+= sizeof(T) * n) -> U* 看起来不错,但我觉得那里可能存在某种未定义的行为。

(我几乎可以肯定它不能在 C++ 中完成,指针算术规则不允许这样做(在任何时候 U 的数组都不会开始存在,所以你不能在这个存储上执行指针算术) . 因此我对 C 规则持谨慎态度)

编辑:

自从P0593R6 被接受并作为缺陷报告应用到所有 C++ 标准回 C++98,对 malloc 的调用隐式地在分配的存储中创建对象。正因为如此,这种构造现在在 C++ 中也有效,并且该范围上的指针算术也得到了很好的定义。

【问题讨论】:

    标签: c malloc


    【解决方案1】:

    在 C 中,您可以通过它的 表示数组 对完整分配的对象执行算术运算,它的类型为 unsigned char [],但可以通过 char * 合法地寻址(不那么冗长)。我不确定是否使用 C++,但我认为您也可以这样做。

    如果 p 是返回的指针,则 (U *)((char *)p + sizeof(T) * n) 是指向您想要的内容的有效指针。

    请注意,您可以通过使用_Alignof(U) 或使用sizeof(U)(或除以它的二的最高幂)作为(不一定是锐利的)对齐估计来摆脱“相同对齐”要求并在两者之间计算出必要的填充以达到对齐的倍数。如果您这样做,请确保分配正确的总金额,包括填充。

    【讨论】:

      猜你喜欢
      • 2011-05-24
      • 2020-10-08
      • 2012-11-21
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 2022-11-10
      • 1970-01-01
      相关资源
      最近更新 更多