C函数是否保证具有固定的内存地址?

j b*_*j b 12 c pointers function-pointers

如果我存储指向函数的指针,然后在程序执行期间的某个稍后点,将它与同一函数的地址进行比较,两个地址是否保证相等.

例如

int foo(void){return 0;}
int (*foo_p)(void) = &foo;

assert(foo_p == &foo);
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,断言始终保证成功吗?是否有任何情况下函数的地址可以改变?

R..*_*R.. 17

按6.5.9:

两个指针比较相等,当且仅当两个都是空指针时,两者都是指向同一对象的指针(包括指向对象的指针和开头的子对象)或函数,两者都是指向同一数组的最后一个元素的指针对象,或者一个指向一个数组对象末尾的指针,另一个是指向紧跟在地址空间中第一个数组对象之后的另一个数组对象的开头的指针.

(为了强调,增加了粗体字.)