According to your structure declaration:
typedef struct month_s { char name[MAX_LEN]; } month_st;
sizeof(month_st) contains spaces for the char array, which is a member of the structures. (Note that you are doing a static memory allocation, name not a pointer, but an array).
Therefore, when you assign one strct variable to another variable, it completely copies the array (or we can say that the total number of bytes sizeof(month_st)) will be copied).
Then you declare two structural variables:
month_st mCur = {"Jan"}; month_st mNext = {"Feb"};
The memories for both mCur and mNext different. When you do the assignment nCur = mNext; , mNext values mNext copied into nCur memory of struct variables, but both have separate (their) memory.
strcpy() :
strcpy(mNext, "Mar");
affecting only the mNext variable, it does not change the contents of the nCur variable.
For your confusion, suppose you declare your structure as follows:
typedef struct month_s { char* name; } month_st;
However, by doing nCur = mNext; , you copy sizeof(month_st)) bytes from the mNext variable to nCur , therefore, only the address copied as name is a pointer to memory.
In this case, the full array / memory (which you probably allocate dynamically), do not copy this, called Shallow copy .