Это работает, потому что тебе повезло. b
и n2
оказались рядом друг с другом в памяти в правильном порядке. C не выполняет проверку границ массивов и, к счастью, позволит вам переполнить их. Таким образом, вы можете объявить массив следующим образом:
char someArray[1] = "lots and lots of characters";
Компилятор C (конечно, старый) подумает, что это нормально, хотя в someArray
явно недостаточно места для хранения такого количества символов. Я не уверен, что он определил, что он будет делать в этой ситуации (я подозреваю, что нет), но на моем компиляторе он ограничивает заполнение размером массива, поэтому он не выходит за границы (someArray=={'l'}
) ,
Ваша ситуация такая же (хотя и менее экстремальная). char b[1]
создает массив с достаточным пространством для хранения 1 байта. Вы помещаете пробел в этот байт, поэтому нет места для нулевого терминатора. strcat
продолжает копировать память до тех пор, пока она не достигнет нулевого терминатора, следовательно, она будет продолжать работать до тех пор, пока не найдет его, даже если этого не произойдет до конца следующей строки (что и происходит в вашем случае).
Если бы вы использовали компилятор C ++, он бы выдал хотя бы предупреждение (или, скорее, ошибку), чтобы сообщить вам, что вы пытаетесь поместить слишком много элементов в массив.