Что вызывает вывод «Hello», когда я включаю -O для gcc? Разве это не должно быть segfault (согласно этой вики )?
% cat segv.c #include int main() { char * s = "Hello"; s[0] = 'Y'; puts(s); return 0; } % gcc segv.c && ./a.out zsh: segmentation fault ./a.out % gcc -O segv.c && ./a.out Hello
Это неопределенное поведение (может произойти сбой, может ничего не делать и т. Д.), Чтобы изменить строковые литералы. Хорошо объяснено в FAQ C.
6.4.5 / 6
Неясно, являются ли эти массивы различными, если их элементы имеют соответствующие значения. Если программа пытается изменить такой массив, поведение не определено.