Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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
int(*func)()在C中做什么?_C - Fatal编程技术网

int(*func)()在C中做什么?

int(*func)()在C中做什么?,c,C,这一行在C中做什么 int (*func)(); 我从下面的程序中提取了它,该程序应该执行字节码(汇编指令转换为相应的字节) 该行为具有未指定参数(自C99以来的“过时”功能)且返回类型为int的函数声明函数指针 main的第一行声明该指针,第二行初始化指针,使其指向函数code。第三行执行它 您可以获得指向函数的指针的一般说明。int(*func)()将func声明为指向函数的指针,该函数返回int类型并需要任意数量的参数。@haccks:Edited。我把它和作为参数说明的void混为一

这一行在C中做什么

 int (*func)();
我从下面的程序中提取了它,该程序应该执行字节码(汇编指令转换为相应的字节)


该行为具有未指定参数(自C99以来的“过时”功能)且返回类型为
int
的函数声明函数指针

main
的第一行声明该指针,第二行初始化指针,使其指向函数
code
。第三行执行它


您可以获得指向函数的指针的一般说明。

int(*func)()
func
声明为指向函数的指针,该函数返回
int
类型并需要任意数量的参数。

@haccks:Edited。我把它和作为参数说明的
void
混为一谈。@haccks:没有否决票,只有撤回。我更像C++的人,在回答C问题时,我应该更好地注意这些差异。过时了吗?你是说过时了吗?或者你真的是说C99之后它变得越来越过时了?@SteveCox:和(6.11.6,第179页)@SteveCox:显然这是他们说“弃用”的方式:某些功能已经过时,这意味着它们可能会在本国际标准的未来修订中被考虑撤销。它们之所以被保留是因为它们的广泛使用,但不鼓励在新实现(用于实现功能)或新程序(用于语言[6.11]或库功能[7.31])中使用它们。(第十七页)有趣的是,编译和运行的示例产生了一个分段错误。为什么
code
被引用为函数…@EugeniuRosca这是因为数组(尚未)包含可执行代码。所以它崩溃了。@EugeniuRosca我认为这是因为堆栈和堆在大多数现代操作系统中都不可执行(出于安全原因)。您必须关闭此功能才能使此代码正常工作。@EugeniuRosca;您需要提供字节码,如
char code[]=“\x48\x31\xc0”
然后将执行此地址的函数。@EugeniuRosca;将有助于您进一步挖掘。参数可以是任何类型,而不仅仅是int。在调用函数时,不会对传递给函数的任何参数进行任何转换(正常函数参数升级除外)或检查,但如果这些参数与函数所期望的不符,则结果是未定义的。@chrisdd;同意。删除了该行,但许多C编译器假定默认类型为
int
。默认为
int
仅适用于没有类型说明符的声明器。所以如果你说
int(*func)(a)
,那将是一个名为
a
int
类型的参数。或者如果你说
(*func)()
在全局作用域中,返回类型将默认为
int
——默认为
int
仅出现在表达式不可能的作用域中(因此在函数中的局部变量上不可能)。@chrisdd-更准确地说,参数将经历默认参数提升。好奇者的更多细节在这里:我并不是故意装腔作势,但这样的论据推广会导致难以诊断的问题,这个特殊的例子很容易出现这样的问题。
char code[] = "bytecode will go here!";
int main(int argc, char **argv)
{
  int (*func)();
  func = (int (*)()) code;
  (int)(*func)();
}