Используете ли вы несколько потоков? Я часто обнаруживал, что распечатки чего-либо может быть достаточно, чтобы эффективно подавить состояние гонки (т.е. не устранять ошибку, а только затруднить ее обнаружение).
Что касается того, как его диагностировать / исправить ... Вы можете переместить второй отпечаток раньше и раньше, пока не увидите, где он меняется?
Вы всегда видите 0x1 позже, когда у вас нет printf
там?
Один из способов избежать задержки / синхронизации printf
состоит в том, чтобы скопировать значение указателя в другую переменную в месте первого printf
, а затем распечатать это значение - чтобы вы могли увидеть, какое значение был в тот момент, но в менее критичной ко времени точке. Конечно, поскольку у вас происходит странное значение «коррупции», это может быть не так надежно, как кажется ...
РЕДАКТИРОВАТЬ: Тот факт, что вы всегда видите 0x1 обнадеживает. Это должно облегчить поиск. По общему признанию, отсутствие многопоточности затрудняет объяснение.
Интересно, связано ли это с дополнительным вызовом printf
с изменением размера стека? Что произойдет, если вы напечатаете значение другой переменной в том же месте, где был первый вызов printf?
РЕДАКТИРОВАТЬ: Хорошо, давайте продолжим идею стека. Можете ли вы создать другую функцию с такой же сигнатурой, как у printf
и с достаточным количеством кода, чтобы избежать ее вставки, но которая на самом деле ничего не печатает? Назовите это вместо printf и посмотрите, что произойдет. Я подозреваю, что ты все еще будешь в порядке.
В принципе, я подозреваю, что вы где-то портили свою стековую память, например, записывая за конец массива в стеке; изменение способа использования стека путем вызова функции может маскировать ее.