【问题标题】:C - Storing an int pointer in an integerC - 将 int 指针存储在整数中
【发布时间】:2010-11-17 13:06:22
【问题描述】:

我有任何 int 类型的数组,需要在该数组中存储指向该数组另一部分的指针。

问题在于,在 64 位系统上,指针的大小为 8 个字节,而 int 的大小为 4 个字节,导致编译器警告(例如警告从不同大小的整数转换为指针)

我(think0 我明白为什么编译器在抱怨,显然试图将 8 个字节放入 4 个字节不是一个聪明的主意。问题是数组按原样提供给我,我必须只使用数组进行存储.

【问题讨论】:

  • 你能解释一下你以后如何读取数组,以一种你可以区分指针元素和整数元素的方式吗?
  • 你能提供一个代码示例吗?

标签: c pointers 64-bit integer


【解决方案1】:

如果你指的是同一个数组,为什么不只存储索引?

#include <limits>
#include <boost/static_assert.hpp>

int array[ARRAY_DIMENSION];

/**
 * the following line will cause an error at compile-time if size_t
 * is not enough to index the array.
 */

BOOST_STATIC_ASSERT(std::numeric_limits<size_t>::max() >= ARRAY_DIMENSION);

int access_array(size_t index)
{
    size_t intended_index = array[index];
    return array[intended_index];
}

【讨论】:

  • 请注意,在 64 位系统上,您可能无法将索引放入 int。不过,您可以将它放入两个 int 中,高和低部分(或者,一般来说,平台上需要许多整数,但任何问这个问题的人都不是在编写一般可移植的代码)。
  • 是的,OP 可以在编译时检查数组的大小。
  • 如果数组的索引太大而无法容纳 32 位无符号整数,则数组(每个元素至少包含一个无符号整数)至少需要 16 GB。这在 64 位系统上并非不可能,但不太可能。无论如何,不​​要使用int,而是使用size_t,问题就会消失。
  • 应该不需要断言,因为size_t被定义为足够大以容纳any对象的大小,而array的大小必须是@ 987654328@.
【解决方案2】:

恐怕做不到。正如您正确推断的那样,您不能将 64 位值放入 32 位中。必须为您提供一个 intptr_t 数组才能使其工作。

【讨论】:

  • +1 用于使用为此明确设计的 C99 类型。一定要#include &lt;stdint.h&gt;
【解决方案3】:

不要将指针存储在ints 中。将指针存储在指针变量中。如果您确实需要这样做,请考虑使用联合数组。

【讨论】:

    【解决方案4】:

    使用结构。

    struct myint
    {
        int array[10];
        int *next;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多