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".