Hallo,
size_t a = (size_t)&mystring[1]; free((char*)a); würde also überall so wie von Dir gewünscht funktionieren (wäre nur reichlich sinnlos).
Ok, gerade nochmal gelesen und Fehler entdeckt: Das würde *nicht* funktionieren, das wäre Blödsinn. Folgendes würde gehen:
size_t a = (size_t)mystring[1]; free((char*)a);
&mystring[1] liefert Dir nämlich vom Datentyp her ein char ** (wenn mystring[1] ein char *) ist - aber keines, das durch malloc() alloziert wurde (das war ja mystring bzw. &mystring[0], das halt mit einer gewissen Größe, damit man den Bereich als Array nutzen kann) - wenn Du das durch free() jagst, gibt's schöne Speicherallokationsbugs, die dann irgendwann wenn das in einer ungünstigen Konstellation passiert zu lustigen Sicherheitslücken führen.
Viele Grüße,
Christian