What is wrong with the following code
#include <stdio.h>
int main(void)
{
        char **blah;
        char *astring = "hello, world\n";
        *blah = astring;
        printf("%s\n", *blah);
        return 0;
}
Fairly obvious when it is layed out like this; that *blah = astring should be blah = &astring (this might be less obvious when it is buried deep within several functions :). blah is uninitalised, so you can't dereference it.
Unfortunatley, this code will compile with -Wall with no warnings. This is because of a little fact
-Wuninitialized
           Warn if an automatic variable is used without first being
           initialized or if a variable may be clobbered by a "setjmp"
           call.
           These warnings are possible only in optimizing compilation,
           because they require data flow information that is computed
           only when optimizing.  If you don't specify -O, you simply
           won't get these warnings.
So always turn on at least -O to get the full checking gcc can give you, and you'll probably catch things like the above before they even segfault.