First of all you must be aware that for the "other" process the pointer cannot be seen as pointer.
You can modify the pointer but not read data from the pointer or write data to it.
The idea to use "int32_t" of "Kerrek SB" would make sense in this case; however using "uint64_t" is more useful because this would allow the 32-bit process to modify a pointer pointing to an address space that is larger than 4 GiB:
typedef union {
uint32_t *ptr;
uint64_t address;
} maxaddr;
Instead of using "hb.old++" you would use "hb.old.address+=sizeof(uint32_t)".