introduction to dynamic memory allocation in c