Pierwszy link który znalazłem w Google mówi o tym jak działa ta funkcja. Jedyne czego możesz nie znaleźć(może nie na tej stronie, ale na innych) to odpowiedź na pytanie trzecie. Odpowiedź jest prosta: nie. Do funkcji read podajesz wskaźnik na niezdefiniowany typ(void*) więc funkcja nie wie czy jest to ciąg znaków czy nie. O to musisz sam zadbać.
Wiesz czym jest buffor? Nastąpi wyciek z niego… W uproszczeniu tablica, ciąg znaków jest wskaźnikiem na dany obszar pamięci, przepełniając go możemy nadpisywać wartości innych danych znajdujących się za właściwą komórką pamięci które mogą być kluczowe w działaniu aplikacji. Proponuje czasem używać umiejętnie strlen bądź strncpy (tutaj kluczowym elementem jest trzeci parametr którym możemy uciąć niechcianą resztę ciągu), gdy nadpiszemy za dużo pamięci programu (każdy program ma przydzieloną określoną ilość) to nastąpi segmentacja pamięci czyli wykroczenie za obszar pamięci danego programu i system dokona interwencji, aplikacja nie wykona swojego działania i prawdopodobnie się wyłączy. Czemu właściwie system chroni pamięć innych programów? Odpowiedź jest prosta, wyobraźmy sobie po prostu że system ma przydzieloną pamięć i trzyma tam bardzo ważne które ważą na stabilności systemu, co się stanie jak je przepełnieniem wkroczymy na nie…? Domyśl się.
Jest to częsty błąd wielu aplikacji dodam więcej, jeżeli instrukcja odpowiada choćby za autoryzacje jest to bardzo groźny błąd chociaż nie jest to regułą bo potencjalny napastnik może w niektórych przypadkach podczepić i wykonać swój kod to i tak to jest groźne, do dzisiaj są znajdowane krytyczne luki tego typu w popularnych aplikacjach.
Poczytaj teorię o stercie i stosie i ogólnie o pamięci programu. A następnie poszukaj informacji o atakach buffer overflow i heap overflow.
By to zrozumieć radze pobawić się czasem debugerem i samą aplikacją na przeróżne sposoby (wprowadzanie nie przewidzianych w programie działań), osobiście polecam GDB.
Funkcja read zwraca ilość bajtów, które wczytała. Możesz więc sam dopisać na koniec ciągu znaków 0(czy inaczej ‘\0’, jeżeli mamy na myśli zwykłe char).