Итак, у вас есть это в стеке:
str1 ---> [X, X]
str2 ---> [Y, Y, Y, Y, Y]
Где каждый X
и Y
являются одиночными char
объектами (т.е. обычно каждый байт памяти).
Когда вы звоните strcat(str1, str2)
, вы просите поставить 5 Y
с, начиная с первого \0
в str1
(до первого \0
в str2
, который в данном случае является последним).
Итак, первый Y
переходит во вторую часть str1
, что нормально:
str1 ---> [X, Y]
str2 ---> [Y, Y, Y, Y, Y]
Но тогда strcat
продолжит запись вне массива другогоОсталось 4 Y
s, то есть он "попробует" следующее:
str1 ---> [X, Y] Y, Y, Y, Y
str2 ---> [Y, Y, Y, Y, Y]
Это ошибка, которая вызывает неопределенное поведение, что означает, что ваша программа имеет ошибку (что происходит точно, зависит:может привести к сбою, неправильному поведению или просто к счастью).
Как говорится в вашем учебнике, решение состоит в том, чтобы str1
был достаточно большим, чтобы вместить, по крайней мере, все:
str1 ---> [X, Y, Y, Y, Y, Y]
str2 ---> [Y, Y, Y, Y, Y]
Другими словами, str1
должен быть массивом не менее 6 элементов.