Which behavior is according to C standard?
Оба поведения в компиляторах соответствуют стандарту. Поскольку @AnT уже объяснил, вызов func1(&g)
нарушает языковое ограничение. Требование Стандарта на компилятор в таком случае выражается в пункте 5.1.1.3/1:
A conforming implementation shall produce at least one diagnostic message (identified in an implementation-defined manner) if a preprocessing translation unit or translation unit contains a violation of any syntax rule or constraint [...]
Как вы можете видеть, @Olaf правильно, что стандарт не различает разные категории диагностики. Это изобретение и con vention реализаций, которые обычно различают эти два на основе того, является ли ситуация фатальной для процесса компиляции. В стандарте нечего сказать о том, что компилятор должен делать, когда обнаружено нарушение ограничения, однако, ни вообще, ни в данном конкретном случае, поэтому он даже косвенно не указывает, должно ли быть «предупреждение» или «ошибка» излучается.
Если компилятор выполняет, он продолжает и в конечном итоге производит исполняемый файл, то вся полученная в результате программа обнаруживает неопределенное поведение, если в любой момент ее выполнения она вычисляет вызов проблемной функции. Это является причиной того, почему компилятор может не выбрасывать такой двоичный файл (например, может считаться, что нарушение ограничений является «ошибкой»), но, опять же, стандарт не предоставляет никаких указаний.
Какое поведение вы ожидали? Вы изменяете значение, которое вы предоставляете компилятору, чтобы никогда не изменять его. – Olaf
Это [интересный вопрос] (http://stackoverflow.com/questions/15576000/in-c-can-a-const-variable-be-modified-via-a-pointer)? –