Question: Consider a system where a `Project` structure contains an array of `Module` structures, each of which contains an array of `Task` structures. Each `Task` has a dynamically allocated description and a pointer to another task that it depends on. Write a C program that:
→ Dynamically allocates and initializes a project with several modules and tasks, linking tasks based on dependencies.
→ Implements a function to display the project hierarchy, including task dependencies.
→ Discuss the potential pitfalls in memory management with this structure and how you ensure there are no memory leaks or dangling pointers.