13 c c++ pointers function-pointers
鉴于所有原始数据类型和对象都分配了内存,因此直观地容易想象指向这些类型的指针.
但是函数指针究竟指向哪里?鉴于指令被转换为机器代码并驻留在内存中,我们是否应该考虑它们指向与函数指令开头相对应的内存位置?
由于非法内存访问,我们在指针中面临许多错误.当函数指针指向数据存储器而不是指令存储器时,是否会发生错误?
And*_*ant 29
函数指针也指向内存,唯一的区别是在该内存位置有可执行代码而不是数据.
在许多平台上,如果您尝试执行数据(例如常规内存),您将崩溃或导致异常.这称为数据执行保护 - 一种安全措施,可防止应用程序无意中运行可能由恶意软件放置的狡猾代码.
函数指针包含函数的地址——无论对于给定系统意味着什么。您可以使用它来间接调用函数,您可以分配和比较函数指针值。您还可以将函数指针转换为另一种函数指针类型,等等。
编译器实现函数指针最直接的方式是作为函数的内存地址,大多数编译器都是这样做的,但是语言标准没有规定。一些系统(我认为 IBM 的 AS/400 就是一个例子)在函数指针中存储附加信息。只要正确实现了所需的语义,编译器就可以将函数指针作为整数索引实现到描述符表中。
无法取消引用函数指针。一个函数调用需要一个指针,而不是一个函数名,作为它的前缀表达式;如果您使用函数名称,则该名称将隐式转换为指针(就语言而言;生成的机器代码可能不同)。因此,程序没有可移植的方式来检测函数指针是否实际包含内存地址。
不可移植,给定一个函数func,您可以执行以下操作:
printf("Address of func is %p\n", (void*)func);
Run Code Online (Sandbox Code Playgroud)
你可能会看到一些看起来像人类可读的内存地址表示的东西。但严格来说,函数指针到的转换行为void*不是由语言定义的,在某些系统上可能不起作用。
你可能甚至可以给一个函数指针转换unsigned char*和检查功能的机器代码,但远远超出了C标准定义的东西。
最好将函数指针视为以某种未指定方式引用特定函数的不透明值。