そんなしょっちゅうstrlenやらなきゃいけないコード書くならヒープ領域自体に
サイズを格納して管理しようぜ。

typedef char* OreoreString;
#define OreoreStringSize(buf) (*(uint32_t*)(buf-4))
#define OreoreStringRewriteSize(buf, newSize) (*(uint32_t*)(buf-4) = newSize)

OreoreString OreoreStringAlloc(size_t n) {
  char* buf = malloc(n + 4);
  if (!buf) return NULL;
  *((uint32_t*)buf) = n;
  return buf + 4;
}
void OreoreStringFree(OreoreString buf) {
  free(buf - 4);
}
OreoreString OreoreStringDuplicate(OreoreString src) {
  int size = OreoreStringSize(src);
  char* cpy = malloc(size + 4);
  if (cpy) memcpy(cpy, src-4, size);
  return cpy;
}

こんなコードをだいがくいちねんせいくらいに書いたことがあったが
なにげにMacのCoreFoundationの文字列がこれに近いデータ構造に
なってるんだよな。
NULL終端つけておけば普通のC文字列関数も使えるし。