Включаемый файл string.h
сообщает компилятору , как определяется strcpy()
, давая объявление функции, но он не предоставляет саму функцию, которая вместо этого находится в библиотеке и будет автоматически связываться с вашей программой.
Если функция не была объявлена при достижении, компилятор примет объявление, основанное на значениях по умолчанию и способах использования функции.
Компилятор берет то, что вы написали, поэтому адреса message
и Hello, world!
и предполагает, что функция возвращает int
. Вы рискуете, не сообщая компилятору, как он должен компилировать код благодаря include
. Результатом является неопределенное поведение.
Кстати, Hello, world!
занимает 14 символов, 13 + завершающий \0
, что на 4 больше, чем в вашем объявлении message
. Это неопределенное поведение, так как дополнительные 4 символа будут записаны там, где они не должны. Кажется, работает, сбой ...
Вы не можете полагаться на программу, показывающую ожидаемый результат. Это неопределенное поведение.
Всегда компилируйте с параметрами предупреждений, такими как -Wall
, и рассмотрите возможность исправления всех предупреждений.