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