It does return a reliable value - just not always the value you expect. For example, if your structure contained:
struct FOO
{
char ch;
int i;
}
And assuming a 1 byte char and 4 byte int, you do not get a result of "5" - the structure is padded so that elements start on their natural boundaries - you are more likely to get a result of "8".
Wiki explains this pretty well:
http://en.wikipedia.org/wiki/Sizeof[
^] - at "Structure Padding", near the bottom.