// выделяется память размером с указатель (4/8 байт для x32/x64), ее адрес записывается в text
text = (const char**)malloc(sizeof(char*));
// в text записывается адрес другой строки, а где там была выделена память - больше никто не знает
text = &smth;
// освобождается та память, на которую указывает text - это переменная smth. Теперь память, в которой лежит эта переменная, может в любой момент быть заменена при новом выделении памяти, и smth получит новое значение, не имеющее никакого отношения к той строке, на которую оно указывало изначально
free(text);