Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我怎样才能克服这个问题;错误C2100:非法间接寻址“;在VS2008中访问void*的内容时_C_Visual Studio 2008 - Fatal编程技术网

我怎样才能克服这个问题;错误C2100:非法间接寻址“;在VS2008中访问void*的内容时

我怎样才能克服这个问题;错误C2100:非法间接寻址“;在VS2008中访问void*的内容时,c,visual-studio-2008,C,Visual Studio 2008,我在VS2008中创建了一个C应用程序。我正在创建一个模拟创建函数,它覆盖结构中的函数引用。但是,如果我尝试以一种直截了当的方式来做这件事,比如: void *ptr = &(*env)->GetVersion; *ptr = <address of new function> 但我担心,如果在32位和64位环境之间切换,使用长指针或int指针会导致问题 那么,有没有简单的方法来禁用此错误?假设不是,win64下是int还是long 64位?上次我在visual st

我在VS2008中创建了一个C应用程序。我正在创建一个模拟创建函数,它覆盖结构中的函数引用。但是,如果我尝试以一种直截了当的方式来做这件事,比如:

void *ptr = &(*env)->GetVersion;
*ptr = <address of new function>
但我担心,如果在32位和64位环境之间切换,使用长指针或int指针会导致问题


那么,有没有简单的方法来禁用此错误?假设不是,win64下是int还是long 64位?

上次我在visual studio下玩void*&C时,VS玩得不好。 以下是一些信息数据点:

指针总是系统字的大小(8/16/32/64)…(除非你有分段内存,我假设你没有)。这是因为它需要指向内存空间中的任何位置。对于冯·诺依曼机器,函数指针的大小将与数据指针的大小相同,因为数据和代码占用相同的内存空间。这在哈佛大学的体系结构下是无法保证的。我对WindowsVista不太熟悉,不知道它是否出于安全原因在程序上伪造了哈佛大学的体系结构


我个人不会禁用这个错误,只是为了让编译器完成它的工作

如前所述,要将函数的地址存储在指针中,不应执行间接寻址

但是,您还谈到担心可能存储指针的int类型的大小(除非您有很好的理由,否则通常不希望这样做)

如果出于某种原因希望在int类型中保留指针,那么在Windows上,a
UINT_PTR
类型(或者
stdint.h
中的
uintptr_t
如果有的话)将保留大多数指针类型(我认为它不一定大到可以保存指向成员类型的指针)。

取消引用“void*”时,你留下了一个“空白”,它没有大小(或者实际上没有类型),所以它不知道如何分配一些东西给它。这与:

void blah = 0xdeadbabe; // let's assume a 32-bit addressing system
要添加到我自己的响应中并给出解决方案,我会给它一个指向GetVersion is类型函数的指针的正确类型。如果“env”结构字段指向的GetVersion为:

int GetVersion();
那么你想要:

int (**ptr)() = &(*env)->GetVersion;
那么:

void **ptr = (void **) &(*env)->GetVersion;
*ptr = <address of new function>
以上假设GetVersion是fncPtr类型,NewFunction声明为
int函数(void)

我以前从来没有这样想过。我一直认为空*是指向任何东西的指针,而不是指向任何东西的指针。我用一个实际的解决方案进行了更新。从技术上讲,“void*”是指向任何东西的指针,但要取消引用,它就是一条蛇在吃自己的尾巴+1对于“当取消引用“void*”时,会留下一个“void”,它没有大小(或者实际上没有类型)”,修复了我的问题,因此基本上一个uint在32位操作系统上是32位的,在64位操作系统上是64位的?如果是这样的话,那么我认为这是我使用的最好的类型。只是要明确一点——它不是
uint
。它是
UINT\u PTR
(或
uintptr\u t
)。它们是足够大的int类型,可以容纳指针(在Win32上是32位,在Win32上是64位)。这非常好(稍微修改一下void**ptr=(void**)和(*env)->GetVersion;)。这很好地整理了代码。谢谢
void **ptr = (void **) &(*env)->GetVersion;
*ptr = <address of new function>
typedef int (*fncPtr)(void);
fncPtr *ptr = &(*env)->GetVersion;
*ptr = NewFunction;