If I store a pointer to a function, and then at some later point during my program's execution, compare it to the address of the same function, are the two addresses guaranteed to be equal.

E.g.

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

assert(foo_p == &foo);

```

In the above code is the assertion always guaranteed to succeed? Are there *any* circumstances under which the address of a function can change?