Почему указатель меняется при переходе функции? - PullRequest
5 голосов
/ 18 октября 2008

В следующем случае я вызываю Func с указателем, переданным на него, но в вызываемой функции параметр показывает значение указателя как нечто полностью поддельное. Нечто вроде ниже.

bool flag = Func(pfspara);--> pfspara = 0x0091d910 

bool Func(PFSPARA pfspara) --> pfspara = 0x00000005
{
    return false;
}

Почему pfspara меняется на поддельный указатель? Я не могу воспроизвести проблему в отладке, только на производстве.

Спасибо.

Ответы [ 5 ]

8 голосов
/ 18 октября 2008

Если вы пытаетесь отлаживать оптимизированный код, например, в Visual Studio, вы не всегда можете полагаться на то, что отладчик правильно показывает значения переменных, особенно если переменная не используется, так что компилятор, вероятно, ее оптимизирует.

Попробуйте запустить это вместо:

bool Func(PFSPARA pfspara)
{
    printf("%x\n", pfspara);
    return false;
}
1 голос
/ 18 октября 2008

В общем, этого никогда не должно происходить. Проблемы, которые могут вызвать симптомы этого типа, включают несовместимость в параметрах компиляции между вызывающим и вызывающим модулями, неправильное приведение указателей на функции-члены или просто ошибки компилятора. Вам нужно предоставить гораздо больше подробностей о вашей проблеме: показать реальный код, указать свой компилятор, указать флаги отладки и производственной компиляции и т. Д.

0 голосов
/ 19 октября 2008

Мне кажется, что вы пишете в стеке ... где-то в вашем коде переполнен буфер в стеке, или вы берете адрес объекта в стеке и записываете его после функции возвращается. Это приводит к повреждению вашего стека.

Это может произойти только в режиме деблокирования, поскольку распределение стека отличается из-за оптимизации и исключения «защитных» блоков, используемых для помощи в проверке такого рода условий.

0 голосов
/ 19 октября 2008

Это звучит как проблема переполнения буфера - что-то перезаписывает эту переменную. Но, как упоминалось в других ответах, невозможно сказать наверняка без какого-либо реального кода для работы.

0 голосов
/ 18 октября 2008

В дополнение к комментариям Расмуса я считаю, что обычно стоит проверить, возникает ли проблема в отладочной сборке, а также в сборке выпуска. Если вы видите подлинные проблемы, возникающие в сборке выпуска, но не в сборке отладки, это часто сводится к ошибке, которая обнаруживается в процессе оптимизации, такой как неинициализированная переменная. Существует реальная опасность при выполнении большей части вашего тестирования в отладочной сборке, чтобы избежать проблемы, с которой вы здесь сталкиваетесь, а затем отправить релизную сборку. ИМО, если у вас нет хорошего набора регрессионных тестов (желательно автоматизированного), я бы не стал отправлять оптимизированный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...