Сначала вы должны завершить свои printfs "\ n" (или хотя бы последним).Но это не относится к segfault.
Когда компилятор компилирует ваш код, он разбивает двоичный файл на несколько частей.Некоторые из них доступны только для чтения, а другие - для записи.Запись в раздел только для чтения может стать причиной ошибки.Строковые литералы обычно помещаются в раздел только для чтения (gcc должен поместить его в «.rodata»).Имя указателя указывает на этот раздел ro.Поэтому вы должны использовать
const char *name = "Vikram";
В своем ответе я использовал несколько слов "может", "должен".Поведение зависит от вашей ОС, параметров компилятора и компиляции (сценарий компоновщика определяет разделы).
При добавлении
-Wa,-ahlms=myfile.lst
в командную строку gcc создается файл myfile.lst с сгенерированнымассемблерный код.Вверху вы можете увидеть
.section .rodata
.LC0:
.string "Vikram"
, который показывает, что строка находится в Vikram.
Тот же код, использующий (должен быть в глобальной области видимости, иначе gcc может сохранить его в стекеобратите внимание, что это массив, а не указатель)
char name[] = "Vikram";
производит
.data
.type name, @object
.size name, 7
name:
.string "Vikram"
Синтаксис немного отличается, но посмотрите, как он сейчас находится в разделе .data, который читаетсянаписать.Кстати, этот пример работает.