Em C, uma string tem como base um array (eu quase que diria que uma string é um array). Se precisas de alterar a string, precisas de ter um array a sério.
Ao definires um apontador, deves indicar para onde ele aponta. A tua instrução char *name; faz um apontador que aponta para um lugar aleatório que pode ser inválido. A instrução char *name = "default.txt"; faz um apontador que aponta para um array que não é alterável (neste caso podia-se fazer const char *name = "default.txt"; para ajudar o compilador a detectar tentativas de alterar o array só de leitura). A instrução char name[] = "default.txt"; faz um array de 12 caracteres que é inicializado com os caracteres 'd', 'e', ..., 'x', 't', e '\o'.
Se te desenrascas com o ingles, aconselho-te uma leitura da secção 6 do FAQ do comp.lang.c.
Basicamente: ao contrário do que muita gente pensa um ponteiro não é um array (uma string), nem um array (uma string) é um ponteiro.