Грэм правильно с «что» , поэтому вот «почему», если вы незнакомы. В C строка определяется как последовательность символов, оканчивающаяся нулевым символом '\ 0'. Причина, по которой строка имеет завершающий символ, заключается в том, что код может определить, где строка логически заканчивается. Даже если вы объявите строку, подобную этой:
char m[1024];
В C нет способа, чтобы код, заданный m, мог понять, что ему выделено 1024 байта, не говоря уже о том, сколько из этих байтов имеет смысл, не имея нулевого символа, который разграничивает конец значимых байтов .
strcat - это функция, которая работает с двумя строками C, поэтому она ожидает, что оба ее аргумента будут соответствовать спецификации, что есть нулевой байт, отмечающий конец значимого ввода. Если m неинициализировано, его содержимое является случайным, поэтому нулевой байт может быть где угодно или нулевого байта не может быть вообще. Для конкатенации strcat просматривает символы первого аргумента, пытаясь найти нулевой байт, отмечающий конец строки. Если, случайно, в неинициализированном массиве нет нулевого байта, он с радостью продолжит поиск за конца строки в произвольных ячейках памяти, которые могут соответствовать другим переменным или внутренней информации стека и т. Д.
Когда strcat, наконец, найдет нулевой байт, он с радостью запишет содержимое второго аргумента, начиная с этого местоположения, и, если это местоположение находится за концом m, он перезапишет какую-то другую переменную или другую часть информации. Если это адрес памяти, который назначен какой-то другой переменной, проблема может быть молчаливой и ее очень сложно найти. К счастью, в вашем случае это было местоположение, в которое не нужно было писать, поэтому ваша программа вылетела с явной ошибкой.
Это также вызывает замечание, что вам действительно следует использовать strncat вместо strcat. strncat позволяет указать максимальную длину создаваемой строки. Ранее я отмечал, что strcat не может определить, что для m выделено 1024 байта, поэтому, если вы попытаетесь объединить m с чем-то, что сделает m длиннее 1023 символов, у вас возникнет та же проблема перезаписи памяти. strncat принимает третий аргумент, который задает максимальную длину результирующей строки и имеет код возврата, который будет указывать, была ли конкатенация урезана из-за достижения этой длины.