Я столкнулся с очень странной проблемой в C, с которой я никогда раньше не сталкивался. Я сузил его до следующего очень простого фрагмента.
Переменные являются глобальными и имеют тип:
int cpd;
int nPart;
А вот соответствующий фрагмент кода, который я постепенно сократил до минимума, необходимого для создания проблемы:
printf("\ncpd1: %d\n",cpd);
int p;
for(p=1;p<=nPart;p++)
{
printf("\ncpd2: %d\n",cpd); exit(0);
}
... Я получаю следующий вывод:
cpd1: 17
cpd2: 0
Как, черт возьми, это возможно ?!
cpd НЕ был переназначен, никакие функции не были вызваны ... все же это изменилось?
КАК?!?!
Это уже давно сводит меня с ума ...
... так есть идеи?
спасибо за ваше время,
Бен.
РЕДАКТИРОВАТЬ: и когда я удаляю -02 из аргументов make-файла для gcc, ОБА операторы печати говорят мне, что cpd = 0!
РЕДАКТИРОВАТЬ: Хорошо, я только что обнаружил, что переменная, которая объявляется один раз глобально, инициализируется как 4.0, а затем никогда не изменяется, теперь, по-видимому, 1.51086e-311 ... Что-то где-то очень неправильно ...
РЕДАКТИРОВАТЬ: РЕШЕНО !: У меня был массив размером 1000, который должен был быть больше 4000, и попытка записи в него повредила память вокруг него. Дело в том, что этот массив НЕ доступен где-либо рядом с этими операторами печати, однако к к обращаются в той же функции, но гораздо раньше (большая функция!). Странное расхождение между инструкциями print должно быть каким-то странным артефактом использования -O2, так как без -O2 обе распечатки cpd печатают поврежденную версию. Спасибо всем, я бы не справился с этим без вашей помощи!