Let's see what happens when the main() runs.
struct info b;
By this you initialize the struct, including the name in it.
name is a char array (as Jay pointed out, it's different from a pointer), and now it is assigned a chunk of memory with some random stuff in it.
Next
b.name = "Michael";
By this you try to assign a string literal to your char array.
Normally, you assign string literal to char array in the declaration like this char a[] = "hello";
It will copy the string literal to a chunk of memory and let a "sit aside the memory". However in your case, b.name is already sitting aside another chunk of memory, and you cannot change the sitting by just do an assignment, because an array is not a pointer.
So, if you want to modify b.name, you either use strcpy as Vaughn Cato said, or you do that character by charater, like
b.name[0] = 'M';
b.name[1] = 'i';
...
which essentially is the same thing as 'strcpy'