Другие ответы говорят о взгляде с точки зрения стандартов, но вот почему происходит сбой.
Компиляторы обычно помещают программные литералы, особенно строки, в постоянную память.Операционная система помечает память как доступную только для чтения, поэтому любая попытка записи в нее будет заблокирована, и на вашей платформе именно это указывает на ошибку сегментации;попытка выполнить операцию с памятью, которая не разрешена.Другим видом сбоя, связанным с неправильным использованием памяти, является ошибка шины, которая обычно указывает либо на несогласованный доступ к памяти, либо на запись на страницу, которая вообще не отображается.Для кода на C разница почти полностью академическая (некоторые другие языковые реализации используют эти ошибки, чтобы помочь им управлять памятью).
Обратите внимание, что захват операций записи только для чтения не зависит от официальной семантики языка,Хотя у вас может быть char*
, указывающий на него, вы все равно не можете его написать.Всегда рассматривайте программные литералы так, как если бы они указывали на постоянную память, и вы не ошибетесь (это не так по умолчанию из-за необходимости поддерживать совместимость со старыми программами).