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.