sizeof(temp)
не делает то, что вы думаете, что делает. Он сообщает вам размер, в байтах, указателя на тип char, который равен temp
. Скорее всего, в вашей системе 4 или 8.
Это не имеет никакого отношения к длине какой-либо конкретной строки или размеру любого конкретного буфера, возвращаемого из malloc
.
Это просто случайность, что вы указали правильную длину при использовании memcpy
и неправильную длину при использовании strncpy
. memcpy
также не будет работать, если передано sizeof(temp)
как длина, и strncpy
будет работать, если передано правильная длина.