Avazart, именно что нет. Откуда там abcde?
Внимательнее прочтите это:
Действительно, в памяти szString1 идет сразу за szString2. Соответственно, если их не разделять между друг другом нулевым символом, то szString2 будет включать содержимое szString1 и изменять его (при изменении "конца" у szString2 - и наоборот).
Таким образом, скрин
отсюда легко объяснить. Я тогда задавался вопросом:
"странно... А почему тут 'a' (из первой строки) вдруг на /0 перезаписалась?"
Дело в том, что после ввода 20 символов в szString2, на szString2[20] автоматом поместился символ /0, как подсказал нам Toshkarik (т.е. это вовсе не "рандомный мусор", как я предполагал изначально), а на этом месте уже находилось szString[1] (т.к. в памяти эти переменные идут друг за другом). Вот и произошла перезапись. Т.е. szString[1] = \0.
Посмотрите на скрин, там szString1 в самом начале содержит \0 (почему - объяснил выше). Соответственно, когда происходит вызов
C++ |
1
| strcat(szString1, " - "); |
|
то strcat сразу натыкается на \0, считает что оттуда надо начинать запись и пишет " - " (т.е. перезаписывает с самого начала). Т.е. в итоге вместо "\0bcd" записывает " - \0".
Так понятно?
P.S. Блин, а в какую сторону у нулевого символа слэш?

А то я и так и сяк... В общем, там где слэш перед ноликом - это у меня нуль-терминатор (какое все-таки страшное название...)