Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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
C 函数指针的大小取决于哪些参数?_C_Pointers_Function Pointers - Fatal编程技术网

C 函数指针的大小取决于哪些参数?

C 函数指针的大小取决于哪些参数?,c,pointers,function-pointers,C,Pointers,Function Pointers,我只是想从内存的角度了解可能影响函数指针大小的各种原因 我想强调的是,我的问题不是如何使用函数指针以及如何进行类型转换。它只是关于如果我声明一个函数指针,比如 int (*fptr)(int, int); 并创建它的一个变量 fptr fun1; 如果我在32/64位机器上运行它,我希望得到的大小是多少 是否可以通过查看函数指针的声明来确定其大小,就像我可以告诉您,在32位机器上,空指针的大小为4字节一样。指针只有一个大小。它指向什么并不重要。它足够大,可以保存进程虚拟内存中可以访问的位置

我只是想从内存的角度了解可能影响函数指针大小的各种原因

我想强调的是,我的问题不是如何使用函数指针以及如何进行类型转换。它只是关于如果我声明一个函数指针,比如

 int (*fptr)(int, int);
并创建它的一个变量

fptr fun1;
如果我在32/64位机器上运行它,我希望得到的大小是多少


是否可以通过查看函数指针的声明来确定其大小,就像我可以告诉您,在32位机器上,空指针的大小为4字节一样。

指针只有一个大小。它指向什么并不重要。它足够大,可以保存进程虚拟内存中可以访问的位置的地址。在当前CPU上,这通常是64位(8字节),在旧CPU上是32位。

指针只有一个大小。它指向什么并不重要。它足够大,可以保存进程虚拟内存中可以访问的位置的地址。在当前CPU上,这通常是64位(8字节),在旧CPU上是32位。

Rango,看:

对于MS Visual C/C++编译器,您可以检查宏
\u WIN64
\u M_IX86
以及其他指示目标处理器体系结构的宏。完整的清单

再者,经过一番思考后,我不得不承认,我关于函数指针的大小将与
void*
相同的说法是错误的(我可以想象,在体系结构中,数据和代码的内存地址可能不同)。无论如何,对于“是否有可能确定函数指针的大小”的问题,考虑到我在评论中得到的澄清,OP与gcc一起工作,
\uuuuuuuuuuuuSizeof\uuuuuuuu指针
可以作为一个答案。尽管@2501在评论中提供的答案要好得多-
sizezof(fptr)
应该与任何编译器一起工作

Rango,请看:

对于MS Visual C/C++编译器,您可以检查宏
\u WIN64
\u M_IX86
以及其他指示目标处理器体系结构的宏。完整的清单


再者,经过一番思考后,我不得不承认,我关于函数指针的大小将与
void*
相同的说法是错误的(我可以想象,在体系结构中,数据和代码的内存地址可能不同)。无论如何,对于“是否有可能确定函数指针的大小”的问题,考虑到我在评论中得到的澄清,OP与gcc一起工作,
\uuuuuuuuuuuuSizeof\uuuuuuuu指针
可以作为一个答案。尽管@2501在他们的评论中给出的答案要好得多-
sizezof(fptr)
应该与任何一个程序中的任何编译器一起工作,但C中的所有函数指针都具有相同的大小。根据C标准,函数指针的大小不必与
void*
相同。因此,您无法将函数指针移植到
void*
。然而,实际上Posix确实要求两者具有相同的大小,否则
dlopen(2)
将无法工作

我要买什么尺寸的


这取决于你的期望?指针大小——数据或函数——取决于编译器(及其选项)。如果您在流行的通用平台上编程,指针大小可能是
sizeof(size\u t)
。但是如果你正在做一些专门的事情,唯一安全的答案是RTFM

在任何一个程序中,C中的所有函数指针都具有相同的大小。根据C标准,函数指针的大小不必与
void*
相同。因此,您无法将函数指针移植到
void*
。然而,实际上Posix确实要求两者具有相同的大小,否则
dlopen(2)
将无法工作

我要买什么尺寸的



这取决于你的期望?指针大小——数据或函数——取决于编译器(及其选项)。如果您在流行的通用平台上编程,指针大小可能是
sizeof(size\u t)
。但是如果你正在做一些专门的事情,唯一安全的答案是RTFM

也许你应该强调你实际遇到并试图解决的问题?请阅读。仅取决于目标CPU体系结构-32位或64位(在一些较旧的系统上是20位、16位)您是否熟悉
sizeof
,或者
PTRDIFF_MAX
?相关:和@rango:您可以查看编译器手册-或者您可以运行计算
sizeof(void(*)(void))
或类似值的代码。主要有两种选择。另一个是从在机器上工作的程序员那里听到的,但他们的观点往往有点狭隘。也许你应该强调你实际遇到并试图解决的问题?请阅读。仅取决于目标CPU体系结构-32位或64位(在一些较旧的系统上是20位、16位)您是否熟悉
sizeof
,或者
PTRDIFF_MAX
?相关:和@rango:您可以查看编译器手册-或者您可以运行计算
sizeof(void(*)(void))
或类似值的代码。主要有两种选择。另一个是来自在机器上工作的程序员的意见,但他们倾向于有点盲目的观点。指针只有一个大小@布鲁斯请看下面的帖子。指针只有一个大小@布鲁斯请看下面的帖子。这被称为“仅链接”答案,并不流行。而
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;这不是标准C的一般特性。@JonathanLeffler我改为代码行,linkAgreed-你改了。你没有解释它的作用,它的用途,或者它的局限性。(而且,JFTR,我的投票结果还没有,无论如何)这个问题没有提到GCC。如果OP对GCC发表了评论(还没有看到,但我认为它在那里),那么OP
__SIZEOF_POINTER__ // Pre-defined GCC macro