それを言うなら sizeof(string_t)
じゃないか
\0の分の領域は必要だしな。sizeof(string_t) + sizeで、
ちょうどsize分の長さの文字列を格納するのに具合のいいサイズになる。

でも俺なら

struct vec {
  T *data;
  size_t length;  // データ長
  size_t capacity; // 確保済みの領域長
};

みたいにするけどな。