Confusão de memória para strncpy em C

Nesta semana, um problema foi discutido pelo meu colega em relação à memória:

Código de exemplo 1:

int main()
{
    #define Str "This is String."
    char dest[1];
    char buff[10];

    strncpy(dest, Str, sizeof(Str));
    printf("Dest: %s\n", dest);
    printf("Buff: %s\n", buff);
}

Resultado:

Dest: This is String.
Buff: his is String.

Código de exemplo 2:

int main()
{
    #define Str "This is String."
    char dest[1];
    //char buff[10];

    strncpy(dest, Str, sizeof(Str));
    printf("Dest: %s\n", dest);
    //printf("Buff: %s\n", buff);
}

Resultado:

Dest: This is String.
*** stack smashing detected ***: ./test terminated
Aborted (core dumped)

Não estou entendendo por que estou obtendo essa saída no caso 1? como o buff nem é usado no strncpy, e se eu comentar a variável buff, ele dará o smashing de pilha detectado, mas com saída para dest. Também para buff porque eu estou recebendo saída como "his as string".

questionAnswers(4)

yourAnswerToTheQuestion