One way to go about it would be to add counters for each datatype. Initialize the counters to the number of static declarations of the datatype and increment them by one whenever memory for that datatype is allocated dynamically. In the end you can multiply the counters to the size of respective datatypes to get the memory used by that datatpe.
Add all counters to get the total memory used by the program. For example
int mem_int=6; //for a,b,c,mem_int,mem_char,total
mem_int=mem_int * sizeof(int);
There may be better ways of doing it, i am not sure if we have to add the memory of d or not, maybe some of the more experienced members can help out with that.