You're storing temporary objects. You need to allocate the player objects on the heap, too, or else they won't survive the end of playerCreate.
Thus you have a list full of invalid pointers. The exact reason for your error (confusing player IDs) is that the temporary player object is always created at the same memory location - this is only happenstance, though. The memory in this place is consequently changed quite often - and the ID always seems to be that of the last player created, because that's the data that was last in the place in memory.