ciąg malloc i scanf

Prosty program poniżej z malloc i scanf z% s, aby uzyskać ciąg jak poniżej, daje mi dane wyjściowe, których nie mogę zrozumieć. Podczas gdy mam „malloced” tylko 5 bajtów, mój ciąg wejściowy przekroczył powyższy rozmiar, ale nie ma błędu segmentacji. Czy scanf zastępuje alokację malloc?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
  char * name;
  int SZSTRING;

    printf("Enter size of name :");  
    scanf("%d", &SZSTRING);
    name = (char*) malloc ((SZSTRING + 1) * sizeof(char));

    printf("Enter name :");
    scanf("%s", name);
    printf("len of 'name' : %d\n",strlen(name));

  printf("name final: \"%s\"\n",name);
  free(name);

return 0;
}

Output:

OptiPlex-380:~/gsa/compile$ gcc -o try try.c 
OptiPlex-380:~/gsa/compile$ ./try 
Enter size of name :4
Enter name :qwertyui
len of 'name' : 8
name final: "qwertyui"

Zauważyłem jeszcze jedną rzecz: z

    //scanf("%s", name);

pokazuje wyjścia

len of 'name'= 0

a lokalizacje „malloced” były faktycznie memset do NULL. Ale jego calloc, a nie malloc, który inicjalizuje przydzielone bajty do 0, jak na stronę podręcznika?

questionAnswers(3)

yourAnswerToTheQuestion