Does anyone know what the "rules" are for using memcpy for non-standard data types?

I ran into problems using combinations of memcpy with the = operator when using AnsiString.

e.g.:

Code:
AnsiString dest;
AnsiString src1 ="abcdefghijklmnopqrstuvwxyz";
AnsiString src2 ="0123456789";
memcpy(&dest,&src1,sizeof(dest));
memcpy(&dest,&src2,sizeof(dest));
works fine.

but something like:

Code:
AnsiString dest;
AnsiString src1 ="abcdefghijklmnopqrstuvwxyz";
AnsiString src2 ="0123456789";
memcpy(&dest,&src1,sizeof(dest));
dest = src2;
memcpy(&dest,&src1,sizeof(dest));
produces unpredictable results.

However, using char * instead of AnsiString works beautifully.

I have used AnsiString extensively, and while it's not such a big deal to change all of my instances of the class to std::string or char *, the Borland app framework I work with uses AnsiString exclusively, so i would have to have a "mirror" property and setter function every time i want to set any of those instances of Ansistring.

can someone explain to me what is wrong here, and how i can avoid it, short of always using char *?