我知道将指针转换为一个 int是不安全的,因为在某些体系结构中指针可能比int大(例如在x86_64中)。
但是如何将指针转换为几个整数,一个数组呢?如果指针大小是int的2倍,则将pointer*
转换为int[2]
。
所需的所需数量为ceil(sizeof(pointer*)/sizeof(int))
。
我需要这样做,因为有一个函数将int作为参数,我想传递指针。
答案 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数组,如何传递数组?,数组总是按地址传递。