How to use malloc to dynamically allocate memory