Никак, если его не помечать.
Для этого в char-строках ("C-strings", "zero-terminated strings") добавляют в конец элемент со значением '\0' (нуль-символ), на наличие которого опираются стандартные функции, вроде strlen(const char*), которая считает символы до первого зеро-терминатора.
ЗЫ Теоретически, есть еще некоторый allocation header, который находится перед выделяемым динамически (то есть только в хипе) буфером, на который ориентируется free(void*), но это никак не регламентируется стандартом.
UPD: Начиная с C++11 у нас есть std::array, который фактически оборачивает буфер в объект.