16. d = (MyString*)malloc(sizeof(MyString)*(strlen(p))); <- Tutaj wystarczy tylko sizeof(MyString) ERROR, a raczej wyciek danych.
Od 13 do 23 jest straszne zamieszanie. Struktura stworzy się zawsze. Możesz patrzeć na rozmiar Char* wejściowego i wtedy zwracać null dla pustego stringa. Musisz skopiować dane wejściowe do struktury w której masz tylko wskaźnik na tablicę więc trzeba do tego wskaźnika przypisać przestrzeń rozmiaru danych wejściowych i wykonać kopiowanie za pomocą funkcji strcpy z biblioteki string.