Прежде всего, вы не обязаны получать ошибку сегментации или любое определенное поведение для запуска неопределенного поведения, например, для изменения строкового литерала. Хотя в Linux строковые литералы помещаются в постоянную память, поэтому их изменение в Linux обычно приводит к ошибке сегментации.
Так почему же этот код не вызывает segfault? Это так, но вы просто не видите этого, потому что вы раздвоены.
«Сегментация Fault (основной сбрасывали)» печатается сообщение вашей оболочки (напр., Баш), когда он обнаруживает, позвонив по телефону wait
, когда процесс завершается он породил с сигналом SIGSEGV
(Segfault). Однако ваша оболочка не получит никаких уведомлений о выходе дочерних процессов; ваш родительский процесс будет.
Ваш родительский процесс вызывает wait
, чтобы подождать и получить код выхода при его завершении. Если вы не проигнорировали код выхода, перейдя в NULL
, чтобы подождать, вы, вероятно, увидите, что код выхода -11
или -SIGSEGV
.
Так что это segfault; ваш родительский процесс просто игнорирует уведомление ребенка о его нарушении.
Зачем вам компилятор segfault при компиляции? – Olaf
Серьезно: размышляйте о последствиях ** неопределенного поведения **. Кто бы вы ни называли «мы» - это не я или другие эксперты С. «Мы» всегда ожидаем носовых демонов. – Olaf
@Olaf указатель не инициализирован. Когда эти две строки скомпилированы как независимая программа, мы получим seg fault – Anushman