If you compare the memory storage of a string and a char[], they are quite similar. They are both allocated on the heap (except literal strings which are created at compile time). They both contain a few variables (for the length and such), and a memory area containing an array of characters.
However, depending on how the string is created, it's memory area may be larger than it's length requires, i.e. it has some unused bytes at the end of the memory area. The memory area of a char[] is always exactly as large as required by the data.
If you for example use a StringBuilder to create a string, and the capacity is larger than it's length (but not more than twice), it returns a string object which contains unused bytes at the end.
Example:
// set capacity to 8
StringBuilder s = new StringBuilder(8);
// put four characters in it
s.Append("Ouch");
// get the string
string result = s.ToString();
The result variable now points to a string object which has a memory area for the character data that is 16 bytes long, but only the first 10 are used (the four characters, plus an \x0 character at the end).