A: 

One notable problem is that you're returning by value in getSibling(), so you'll get a copy of the sibling rather than that actual sibling. Any changes you make will be to the temporary object.

As others have noted, you're addSibling function should be sibling = p. That's the source of your error.

But be sure to correct your getSibling function otherwise your setAddress won't do what you want.

JoshD
+1  A: 

Using operator * assumes that you deal with some data resided by address stored in this variable. Let's review your code:

*sibling = *p;

You trying to copy by value. This is wrong because sibling points to nowhere. It is even not a NULL, it is unpredictable. The correct line will be:

sibling = p;

So you tell that would store pointer to another instance.

Dewfy