Это правда, что bar
зарезервировал 2 символа, и вы заполняете его на 8 символов больше, чем он может обработать.
Это не означает автоматическиошибка.
Вы не знаете, что содержится в этих 8 переполненных символах, и, скорее всего, это бессмысленный мусор, который можно перезаписать.Ошибка сегмента происходит, когда вы фактически перезаписываете на другую страницу виртуальной памяти или перезаписываете что-то важное (например, драйвер устройства или программный код).
Это хороший пример неопределенное поведение .Undefined не означает, что WILL не удастся, это действительно означает, что поведение undefined ;это может сработать, может не получиться, обезьяны могут вылететь из порта USB ... все может случиться.В этом случае это на самом деле работает, но вы не можете полагаться на это поведение, потому что оно может измениться при следующем запуске программы.
И, наконец, только потому, что немедленного сбоя нет,не означает, что вы не повредили систему.Возможно, вы перепутали память с перезаписью, и вы можете не увидеть ее намного дальше в вашей программе, когда она внезапно вылетает на совершенно нормальном коде, который оказался в той же области памяти.
Кстати: в вашем коде есть еще одна ошибка.
Вы описываете my_ascii
как 10 символов, но пытаетесь скопировать в него 11 символов.
Не забывайте о NULL-терминаторе в конце строки!
Это означает, что строка "0123456789"
на самом деле требует 11 символов памяти.