Per prima cosa si deve terminare la stampa con "\ n" (o almeno l'ultima). Ma questo non è legato al segfault.
Quando il compilatore compila il codice, divide il file binario in diverse sezioni. Alcuni sono di sola lettura, mentre altri sono scrivibili. La scrittura in una sezione di sola lettura può causare un segfault. I valori letterali delle stringhe di solito sono posizionati in una sezione di sola lettura (gcc dovrebbe inserirli in ".rodata"). Il nome del puntatore punta a quella sezione ro. Pertanto è necessario utilizzare
Nella mia risposta ho usato alcuni "potrebbe" "dovrebbe". Il comportamento dipende dal sistema operativo, dal compilatore e dalle impostazioni di compilazione (lo script linker definisce le sezioni).
Aggiunta
-Wa,-ahlms=myfile.lst
a linea di comando di gcc produce un file chiamato myfile.lst con il codice assembler generato. In alto potete vedere
.section .rodata
.LC0:
.string "Vikram"
il che dimostra che la stringa è in Vikram.
Lo stesso codice utilizzando (Deve essere portata globale, altrimenti gcc può memorizzare in pila, notare che è un array e non un puntatore)
char name[] = "Vikram";
produce
.data
.type name, @object
.size name, 7
name:
.string "Vikram"
L' la sintassi è un po 'diversa, ma guarda come è ora nella sezione .data, che è in lettura-scrittura. Tra l'altro questo esempio funziona.
Non ne sono del tutto sicuro. Funziona come previsto sul mio Mac con OSX Lion (conforme a LLVM, debugato con LLDB). –