如果我存储指向函数的指针,然后在程序执行期间的某个稍后点,将它与同一函数的地址进行比较,两个地址是否保证相等。
E.g。
int foo(void){return 0;}
int (*foo_p)(void) = &foo;
assert(foo_p == &foo);
在上面的代码中,断言始终保证成功吗?是否有任何情况,在这种情况下,函数的地址可以改变?
答案 0 :(得分:17)
按6.5.9:
两个指针比较相等,当且仅当两者都是空指针时,两者都是指向同一对象的指针(包括指向对象的指针和开头的子对象)或函数< / strong>,两者都是指向同一个数组对象的最后一个元素之后的指针,或者一个是指向一个数组对象末尾的指针,另一个是指向不同数组对象的开头的指针紧跟地址空间中的第一个数组对象。
(粗体添加了强调。)
答案 1 :(得分:0)
函数的地址永远不会改变。许多程序都是围绕回调的概念构建的,如果函数的地址可能发生变化,这将无效。
假设某个函数的位置发生了变化,例如通过自修改程序,那么对该函数的所有调用都会以任何方式导致段错误或非常不确定的行为。编辑:澄清 - 函数符号就像指针一样,如果指针所指向的free
内存,它不会将实际的指针变量归零,它仍会指向那里,就像你的函数调用仍将指向旧的一样移动功能的位置。
自修改程序是非常大的例外,在这些日子里,二进制文件的代码部分被写保护,这非常非常困难。