Массивы char в c++?
Нельзя создавать массивы заранее неизвестной длины таким образом. У вас n должно быть константой. Либо используйте динамические массивы, а еще лучше - контейнеры из std
1. sizeof возвращает размер объекта, которым в данном случае является указатель, и у вас случайно совпало с длиной строки.
2. массив таким образом в C++ создавать нельзя. Как уже написали выше. 
PS: можно конечно поизвращаться и написать константное вычисление строки на этапе компиляции.
Например наподобииtemplate <int L>
constexpr size_t cstrlen(const char (&s)[L])
{
	return L ? L - 1 : 0;
}
Или:constexpr size_t cstrlen(const char* s)
{
	return *s ? 1 + cstrlen(s + 1) : 0;
}
Но в каких компиляторах такое может как-то не так выстрелить никто не скажет