О нюансах работы со строками и массивами в C
За вас память в си никто не выделяет. 
Цитата отсюда:To avoid overflows, the size of the array pointed by destination shall be long enough to contain the same C string as source (including the terminating null character), and should not overlap in memory with source.
На вопрос Вам уже ответили - Вы и только Вы следите за достаточностью блока памяти. Строки в С почти ничем не отличаются от обычного массива. Разве что нуль символ компилятор ставит автоматически если инициализация строки производится в кавычках. 
Пример 1:char h[20]="Hello";
Выделяется массив из 20-ти элементов char, первые 6 из которых будут заполнены значениями, остальные 14 будут иметь случайные значения.
Пример 2:char h[20]={'H', 'e', 'l', 'l', 'o'};
Выделяется массив из 20-ти элементов char, первые 5 из которых будут заполнены значениями, остальные 15 будут иметь случайные значения.
Еще хотел обратить Ваше внимание на один момент. void strcpy(char *s, const char *t)
указатель на char откуда копируете строку следует объявлять константным. В С++ так нужно уже давно. В С уже тоже. Хотя, не знаю с какой версии стандарта.