If I had to guess, the most challenging thing about C is memory management. Unlike other languages, C doesn’t hide the details about where your data lives in memory and, unless you’re writing very simple programs, sooner or later, you’ll have to make sure your data lives long enough to do something useful. To effectively manipulate memory with C, first, it’s necessary to understand addresses and pointers.