Learn how to use gdb, the C debugger. It will be painful to start with but it will basically save your life, because it's one of the few ways to get a stack trace in C. (where stack trace == the list of function calls Python gives you for free.)
I don't do much C, but I believe the following should work.
- Compile your program with the -g flag (this adds debugging hooks to your program...or something along those lines. It lets you use gdb on your executable. I'm not sure how it actually works.)
- Run "gdb <executable name>"
- This should put you into an interpreter prompt on the command line. From here, you'll have to look up the gdb commands, because I don't remember them off the top of my head. I believe "break <line num>" or "break <function name>" puts a breakpoint at that point in the code. It might be <filename>:<linenum/function> to specify a certain file but you should look that up. "r" or "run" starts running your program, and pauses it at the first breakpoint it hits.
- Once at a breakpoint, "bt" or something similar gives you a backtrace. There's some command for listing current variable contents, another for printing things. To start running from a breakpoint, you can either do "step"/"s", "next"/"n", "continue"/"c".
Step = execute the next line, then pause. If the next line is a function call, step into that function call. (stops at the first line of that function's code)
Next = execute the next line, then pause. If the next line is a function call, run that function call in full before stopping.
Continue = execute until the next breakpoint.
One of my courses gave a virtual machine with cgdb installed, which is gdb except it automatically displays the code in the terminal instead of just the line number. If you're on a Linux system you can probably install it pretty easily, and it may be more helpful than plain gdb.
Edit: You can also try the binary search trick if your code is structured nicely enough. Put printf at the very start (as in, literally first line) to make sure you can actually run prints. Then place printf in the middle. If fail, move printf to ~1/4 of the way in. If success, move to ~3/4 of the way in. Do binary search on your printf location until you figure out the rough area where it crashes, repeat for other functions.