我试图实现以下功能:
private void generateLogon()
其中 p 实际上是一个指向int值的 n-levels 指针,该函数必须返回该值。所以:
int foo(const void *p, unsigned int n);
value = (int)(p);
等等......
所以,我认为以下实施可能是正确的:
value = *(int*)(p);
但是,在这段代码中,我假设指针的大小总是等于int的大小,我知道它不是真的。但是,由于 p 始终是指向int( n 次)的指针,我想也许我总是可以将 p 强制转换为指向像我在代码中那样使用int。
我的想法是否正确?我在互联网上找不到类似的问题。
提前致谢!
答案 0 :(得分:4)
您递归的底部情况不正确,因为这假设void*
和int
具有相同的宽度。
if (n == 1) return *(int*)p;
会更好。
答案 1 :(得分:2)
我不确定你想要完成什么,但我怀疑有更好的方法。
无论如何,指向某事物的指针与指向某物的指针的指针大小相同。
所以你可以将(void *)转换为(void **)。
但是,将指针强制转换为int可能会丢失信息,因为sizeof(void*)
可能是> sizeof(int)
。
你应该写:
int foo(const void *p, unsigned int n) {
//if n is 0, then p is already an int, but has been casted to a void*
//This should probably never happend, so you should assert that n > 0
//if n is 1, then p is actually a pointer to an int
if (n == 1) return *(int*)p;
//else dereference it (by casting it to a (void**) and *then* dereferencing it)
return foo(*(void**)p, n-1);
}
答案 2 :(得分:2)
这假设您的int
不大于void*
:
int foo(const void *p, unsigned int n) {
if (!n) {
return reinterpret_cast<int>(p);
}
return foo(*static_cast<void**>(p), n - 1);
}
除了n=0
案例之外,我们可以避免这种假设:
int foo(const void *p, unsigned int n) {
if (!n) {
return reinterpret_cast<int>(p);
}
if (n==1) {
return *static_cast<int*>(p);
}
return foo(*static_cast<void**>(p), n - 1);
}
在C
中,您可以将static_cast<X>
和reinterpret_cast<X>
条款替换为(X)
。
答案 3 :(得分:1)
一般情况下,如果可能,最好坚持使用迭代解决方案,而不是递归。
int foo(void *p, unsigned int n) {
for (unsigned int i = 0; i < n; ++i) {
p = *((void**)p);
}
return (int)p;
}
IDEONE:demo
它可以让你避免大概n
的理论上可能堆栈溢出的问题(我不知道为什么你需要取消引用1000+级别的深指针,但我不知道为什么你首先需要这个函数,所以让我们保持函数安全)并避免不必要的函数调用开销(是的,它可能会被编译器优化,但为什么不首先以最佳方式写它?)