Assuming two blocks allocated by malloc() that are internally next each other(who knows they next each other? just assumption), after free() two blocks, are they emerged into one unallocated block? Not sure, please help. Thanks.
This fully depends on the implementation. Some allocators do consolidate, some do if certain conditions are met, some don't. It's not something you can assume in any way though. If this is an issue, find a solution that does not depend on such assumption (e.g manage a fixed pool yourself).
That depends entirely on the implementation of the allocator. There are many different implmentations, some of which perform coalescing of adjacent free memory.
Edit: Here's a research paper that describes various allocation techniques and benchmarks their effect on fragmentation. I think their conclusion is that address-ordered free block lists (which make for easy coalescing) perform very well.
I don't think there are algorithms commonly used which never coalesce adjacent memory. But there are algorithms which don't do it as soon as two free blocks are adjacent but need some additional conditions. Two examples:
allocators using different memory regions depending on the asked size (for example which use special purpose datastructure for small blocks size so that they have less overhead) will often not coalesce adjacent blocks for some sizes even if they use a more general algorithm for other sizes;
buddy memory allocators will combines two blocks only if they are buddy.
No guarantees, but many allocators do. If you have a performance problem involving memory, you will get answers more to the point if you pose that question directly. There are many, many techniques for improving memory performance of C code; it's a frequent bottleneck.