within procedures (aka not on the stack) are stored?
In the data segments (AFAIK there's one for initialized and one for uninitialized data).
And can this address space be changed by the user easily?
I think one would have to write a linker script. I don't know details, but it might not be too hard. After linking, AFAIK, the addresses can't be changed.
You could also include the heap. There you might want to change addresses ( using new and dispose ) to do garbage collection.
Possible built-in late binding support could be another possibility (PIC,threadvar support)