![]() |
|
Модераторы: bsa |
![]()
|
|
| KasMP |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: нет Всего: 30 |
Тем временем, у меня появилась еще одна простенькая программка, которая компилируется без одной ошибки, без единого предупреждения и отлично выполняется при запуске из DevC++.
Но в MS Visual C++ 2008 в самом конце выполнения возникает такая ошибка: ![]() Я совсем не понимаю, что может быть причиной ошибок такого рода в моем случае - у меня все переменные ограничены, все массивы ограничены, длины строк взяты с большим запасом, не в свои ячейки памяти я не лезу, т.п. и т.д.. Взгляните, пожалуйста (здесь совсем немного и несложно - перевод числа из арабской СС в римскую):
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
%d требует указатель на int, а у тебя number типа short
|
|||
|
||||
| KasMP |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: нет Всего: 30 |
||||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
|
|||
|
||||
| KasMP |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: нет Всего: 30 |
bsa, благодарю
Теперь буду знать еще один спецификатор Пыталась понять, почему это так существенно По сути
Т.е. конкретно в моем случае получается "представить переменную типа short int как int". В чем проблема? Множество значений вкладывается, недостающие до int биты можно заполнить нулями-единицами в зависимости от знака. Вот если "представить переменную типа int как short int", то я бы тоже стала сопротивляться... А переход от большего к меньшему должен быть возможен, имхо (DevC++ со мной согласен |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
ты запихнула в стек переменную размером в два байта (short int), а scanf запишет туда 4 байта(%d), в результате перезапишет чужие данные которые были в стеке. Имхо DevCpp просто не проверяет стек на возможное повреждение, а Студийный компилятор вероятно на границах стека ставит свою сигнатуру и после операций со стеком проверяет ее - если затерта , значит стек разрушен... |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
KasMP, вообще-то смысл этих спецификаторов в том, что ими ты определяешь не только способ отображения, но еще и типы данных, с которыми должна работать функция. Ни компилятор, ни она сама не могут иначе определить их самостоятельно (почитай про функции с переменным числом аргументов и стандартный заголовочный файл stdarg.h). Например, чтобы избежать переполнения (выхода за границы) буфера при чтении строки с помощью scanf, нужно в спецификаторе указывать размер этого буфера: %20s - буфер на 20 символов. Таким образом, scanf считает в него только первые 20 букв.
Дальше, есть такая штука, как "выравнивание". Т.е. в стеке нельзя просто выделить память, не кратную какому-то числу (обычно, 4 байта). short int - это два байта. Т.е. чтобы разместить эту переменную в стеке, нужно выделить 4 байта. Компилятор gcc (который входит в состав Dev-Cpp), видимо, делает выравнивание без генерации какого-либо дополнительного кода проверки выхода за границы переменной, а Visual C++ делает. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
мне кажется что выравнивание на стек не распространяется.. хотя точно не знаю..и даже не знаю где посмотреть ) |
|||
|
||||
| KasMP |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: нет Всего: 30 |
Понятно Эх... А я доверяла DevC++, считала его хорошим, умным и надежным. (нередко он мне нравился больше VS, т.к. на нем больше программ запускается bsa, спасибо за хорошее развернутое объяснение и ссылочки |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
KasMP, в настройках компиляции DevCpp поставь -Wall и тебе он будет писать предупреждение при ошибке в спецификаторе. А надежность тут непричем.
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |