Почему эта программа не segfault? - PullRequest
2 голосов
/ 13 октября 2011

Что вызывает вывод «Hello», когда я включаю -O для gcc? Разве это не все-таки segfault (согласно этой wiki )?

% cat segv.c 
#include <stdio.h>
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

1 Ответ

12 голосов
/ 13 октября 2011

Это неопределенное поведение (может произойти сбой, может ничего не делать и т. Д.) Для изменения строковых литералов. Хорошо объяснено в C FAQ .

6.4.5 / 6

Не определено, различаются ли эти массивы при условии, что их элементы имеют соответствующие значения. Если программа пытается изменить такой массив, поведение не определено.

...