* Allocating large data structures in functions puts them on the stack. Typically your task's stack is only 128 bytes, so putting things like a network buffer on the stack will almost certainly cause a stack overflow. Instead, make large data structures global.

* Malloc does work, but if you frequently malloc and free memory you will create fragmentation. Eventually this fragmentation can lead to malloc failing. This is especially bad when you run your application for a few minutes and it seems fine, but then fails after a few hours. In general, avoid using malloc whenever possible. If you must, use it in situations where the code can safely continue if allocation fails.