Primero debe terminar sus printfs con "\ n" (o al menos el último). Pero eso no está relacionado con segfault.
Cuando el compilador compila su código, divide el binario en varias secciones. Algunos son de solo lectura, mientras que otros son escribibles. Escribir en una sección de solo lectura puede causar una segfault. Los literales de cadena generalmente se colocan en una sección de solo lectura (gcc debe ponerlo en ".rodata"). El nombre del puntero apunta a esa sección ro. Por lo tanto, debe usar
const char *name = "Vikram";
En mi respuesta, he usado algunos "puede" "debería". El comportamiento depende de su sistema operativo, el compilador y la configuración de compilación (el script del enlazador define las secciones).
Adición
-Wa,-ahlms=myfile.lst
de línea de comandos de gcc produce un archivo llamado myfile.lst con el código ensamblador generado. En la parte superior se puede ver
.section .rodata
.LC0:
.string "Vikram"
Lo que demuestra que la cadena está en Vikram.
El mismo código utilizando (Debe ser en el ámbito global, de lo contrario gcc puede almacenar en la pila, tenga en cuenta que es una matriz y no un puntero)
char name[] = "Vikram";
produce
.data
.type name, @object
.size name, 7
name:
.string "Vikram"
El la sintaxis es un poco diferente, pero vea cómo está ahora en la sección .data, que es de lectura-escritura. Por cierto, este ejemplo funciona.
No estoy del todo seguro. Funciona como se esperaba en mi mac con OSX Lion (cumplido con LLVM, depurado con LLDB). –