Dynamic memory allocation in C allows the size of data structures to be changed during program execution. The malloc() function allocates memory on the heap and returns a void pointer. Additional functions like calloc(), free(), and realloc() allow allocating and freeing contiguous blocks of memory and resizing allocated blocks. System calls like brk() and sbrk() are used to change the program break which marks the end of the heap.