With dynamic memory allocation, you may do whatever you want.
It is possible, for instance, this way:
struct stu
{
int a,b,c;
};
int main()
{
struct stu * pstu;
pstu = malloc(sizeof(*pstu) + sizeof(int));
pstu->a = 10; pstu->b = 20; pstu->c = 40;
* (int*)((unsigned char *)pstu + sizeof(*pstu)) = 40;
free(pstu); return 0;
}
As you may easily recognize, it is not the cleanest way to do things.
(Neverthless
Win32 API
often uses a similar approach).