如何将指针序列化为一个int数组?

时间:2009-08-17 11:19:27

标签: c++ c pointers casting portability

我知道将指针转换为一个 int是不安全的,因为在某些体系结构中指针可能比int大(例如在x86_64中)。

但是如何将指针转换为几个整数,一个数组呢?如果指针大小是int的2倍,则将pointer*转换为int[2]

所需的所需数量为ceil(sizeof(pointer*)/sizeof(int))

我需要这样做,因为有一个函数将int作为参数,我想传递指针。

8 个答案:

答案 0 :(得分:2)

您的平台不提供intptr_t吗?

答案 1 :(得分:2)

相当强大&便携式:

void* p = foo();
std::vector<int> buf(sizeof(p));
std::copy(reinterpret_cast<char*>(&p),
          reinterpret_cast<char*>(&p) + sizeof(p),
          buf.begin());

答案 2 :(得分:1)

这样的事情:

void *pointer = (void*) 0x0123456789ABCDEFULL;

// 4 int's max, I don't know how to do it in a generic way
assert(sizeof(pointer) <= 4*sizeof(int));

int buffer[4]; // copy from pointer to buffer
memcpy(buffer, &pointer, sizeof(pointer));

// call the function
f(buffer[0], buffer[1], buffer[2], buffer[3]);

// how to recover the value of the pointer
void f(int b0, int b1, int b2, int b3) {
   int buffer[4] = {b0, b1, b2, b3};
   void *pointer; // copy from buffer to pointer
   memcpy(&pointer, buffer, sizeof(test_pointer));
}

答案 3 :(得分:0)

我想不出这样做的理由,但这取决于你:)。

通常你不应该以通用的方式做到这一点,所以我要做的是,编码指针必须转换的2或3种方式。


if( sizeof(pointer) == sizeof(int16) ) //or short
{
    transformShortToInt(pointer);
}
else if( sizeof(pointer) == sizeof(Int32) )
{
    (int)pointer;
}
else if( sizeof(pointer) == sizeof(Int64) )
{
   int[2] ar = new int[2];
   ar[0] = (int)(pointer & 0x0000FFFF);
   ar[1] = (int)((pointer>>32) & 0x0000FFFF);
}

虽然通用代码也不会那么复杂。

编辑:通用:

int arSize = sizeof(pointer)/sizeof(int);
if(arSize < 1) 
{
    arSize = 1;
}

int[] args = new int[arSize];

for( int i = 0; i < arSize; i++ )
{
  args[i] = (int)((pointer>>(i*32))&0x0000FFFF);
}

虽然我没有测试指针&gt;&gt;会发生什么0我想它应该有用:)。

答案 4 :(得分:0)

另一个解决方案:

#define BIG_ENOUGH 4

typedef union {
   int buffer[BIG_ENOUGH];
   pointer_t* pointer;
} proxy_t;

static_assert(sizeof(pointer_t*) <= BIG_ENOUGH*sizeof(int));

// before calling the function

proxy_t proxy;
proxy.pointer = the_pointer;

// call to the function, cannot be generic here
f(proxy.buffer[0], proxy.buffer[1], proxy.buffer[2], proxy.buffer[3]);

// how to recover the value of the pointer
void f(int b0, int b1, int b2, int b3) {

  proxy_t proxy = { { b0, b1, b2, b3 } };

  the_pointer = proxy.pointer;

}

答案 5 :(得分:-1)

如果一个函数采用一个int数组,那么是的,您可以手动检测void *的大小与机器上int的大小,并将指针保存到array [0] + array [1]等。

从你的描述中分辨出真正需要的内容有点难。这个功能会做什么?例如,您是否必须处理大/小端差异?

答案 6 :(得分:-1)

我有这个宏:

#define DIM_ARR(arr) (sizeof(arr) / sizeof(arr[0]))

即使数组为空 - 这种结构(sizeof(arr [0]))在编译时解析 - 这就是为什么你会得到正确的大小

答案 7 :(得分:-1)

你说你想把指针传递给一个以int作为参数的函数 如果你的指针指向一个整数或字符或浮点数,你总是可以取消引用它,加速它并传递值 或者,如果您确实想通过地址传递,则修改函数定义以将指针作为参数。

或者,如果您正在使用某些库函数,那么您的方法就错了。

即使你将它转换为一个int数组,如何传递数组?,数组总是按地址传递。