Just curious: any reason you manually processing /dev/fsevents rather than using the FSEvents interface that's designed for interacting with it (at least for the most common cases)? /dev/fsevents is pretty tricky to talk to directly. Ars Technica did a nice writeup.
For this kind of code, I'd get away from malloc and memcpy. That's going to add a lot of overhead to your queue management. And I'd get away from manual thread management. This is exactly the kind of problem that GCD is designed to handle, in particular using dispatch_data. It lets you create immutable memory blocks that you can process and manipulate without requiring copying. You can make a dispatch_source to read /dev/fsevents and pass you back dispatch_data objects. See the Reading Data from a Descriptor section of the Concurrency Programming Guide for an example.
It's not quite clear what you mean by "the char* pointer gets realligned." Do you mean you're modifying the same variable on two threads without locks?
But unless you really need raw access, I'd be looking at the FSEvents interface.