Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с приоритетами унарных операций, ошибка битый стек 
V
    Опции темы
voyageur
Дата 27.2.2009, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 23.11.2005

Репутация: нет
Всего: нет



Здравствуйте! Подскажите, пожалуйста, как исправить?
Код

#include<iostream>
using namespace std;
void main()
{
 int i1=10, i2=20, i3=30;
int *p=&i2;
//Значение i2
cout <<"\n *&i2 = "<< *&i2;
//Значение i2 сначала увеличенное на 1
cout <<"\n *&++i2 = "<< *&++i2;
//Значение i2
cout <<"\n *p = "<< *p;
//Значение i2,  p увеличивается на 1
cout <<"\n *p++ = "<< *p++;
//Значение i1
cout <<"\n *p = "<< *p;
//Значение i1 сначала увеличенное на 1
cout <<"\n ++*p = "<<++*p;
//Значение i2, сначала уменьшается p
cout <<"\n *--p = "<<*--p;
//Значение i3, сначала уменьшается p, затем полученное значение i3 
//увеличивается
cout <<"\n ++*--p = "<<++*--p;
}


Результат должен быть:
Код

*&i2 = 20
   *&++i2 = 21
   *p = 21
   *p++ = 21
   *p = 10
   ++*p = 11
   *--p = 21
   ++*--p = 31

Но при отладке вылазит ошибка Run-Time Check Failure #2 - Stack around the variable 'i2' was corrupted.
и результат работы:

  
Код

*&i2 = 20
 *&++i2 = 21
 *p = 21
 *p++ = 21
 *p = -858993460
 ++*p = -858993459
 *--p = 21
 ++*--p = -858993459

использую VS 2005

Это сообщение отредактировал(а) voyageur - 27.2.2009, 16:51
PM MAIL   Вверх
pan2004
Дата 27.2.2009, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 1
Всего: 9



voyageur, кто сказал, что после инкрементирования указателя он будет указывать на другую переменную(i1)? В release версии такое возможно и сработает, но является грязным хаком, так что UB(порча стека) - закономерный результат неправомерных действий.


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
voyageur
Дата 27.2.2009, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 23.11.2005

Репутация: нет
Всего: нет



pan2004, это нас в институте такому учат, прям вот как препод на доске написал так и есть. То есть нельзя чтоли таким образом адрес изменять? должно перейти на i1 т.к. в памяти оно хранится перед i2, то есть адрес переменной i2 - 1 будет i1 а если i2 +1 то будет i3. Разве нет?

Это сообщение отредактировал(а) voyageur - 27.2.2009, 19:53
PM MAIL   Вверх
pan2004
Дата 27.2.2009, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 1
Всего: 9



Цитата(voyageur @  27.2.2009,  19:52 Найти цитируемый пост)
Разве нет?

Нет. Скорее всего ты не сможешь найти в стандарте места, который оговаривает такое поведение.
В дебаг режиме компилятор(VS) судя по всему "окаймляет" каждую стековую переменную специальными метками. Во время выполнения проверяется целостность этих меток, а так как они повреждены(твоим блуждающим указателем), это идентифицируется как stack damage(то же самое касается и "кучи" в режиме дебага). Подобный механизм позволяет в дебаг версии быстро отловить ошибки типа выхода за границы массива. 
В релиз версии подобные метки ставится не должны, так что твоя программа может даже работать. Но не стоит на это полагаться. В настоящих программах строго рекомендую не пользоваться подобными уловками.


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
vinter
Дата 27.2.2009, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(voyageur @  27.2.2009,  20:52 Найти цитируемый пост)
прям вот как препод на доске написал так и есть

значит препод баран. Не слушай его в дальнейшем.


--------------------
Мой блог
PM MAIL WWW   Вверх
cutwater
Дата 27.2.2009, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 1
Всего: 10



Цитата(pan2004 @  27.2.2009,  20:11 Найти цитируемый пост)
то же самое касается и "кучи" в режиме дебага


pan2004, сегодня столкнулся с багом у себя в программе по этой части. компилятор cl (Visual Studio 2008)
подобного поведения не заметил. ошибка - обнуление памяти большего размера чем выделено( выделение при помощи оператора new), как проявлялось - bad_alloc exception при последующем выделении памяти.
В релиз версии не проверял, но имхо это поведение не похоже на описанное выше.

Думаю самостоятельно смогу найти описание данного поведения компилятора на этот счет, но если не сложно, был бы благодарен за ссылку на описание.


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 27.2.2009, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(voyageur @  27.2.2009,  18:52 Найти цитируемый пост)
это нас в институте такому учат, прям вот как препод на доске написал так и есть

может это относилось к функции типа void f(...); (с переменным кол-вом аргументов) ? только в этом случае есть необходимость и возможность перебирать параметры "вручную" по указателю.


--------------------
PM MAIL WWW   Вверх
voyageur
Дата 28.2.2009, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 23.11.2005

Репутация: нет
Всего: нет



pan2004, спасибо за полный ответ.

mes, нет, такой код нашел в сети: http://it.kgsu.ru/C++/c0018.html пример 3. 
PM MAIL   Вверх
cutwater
Дата 28.2.2009, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 1
Всего: 10



Цитата(voyageur @  28.2.2009,  00:10 Найти цитируемый пост)
такой код нашел в сети: http://it.kgsu.ru/C++/c0018.html пример 3.  


Убивать нужно за такое (творчество).


Это сообщение отредактировал(а) cutwater - 28.2.2009, 13:48


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 28.2.2009, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(voyageur @  28.2.2009,  00:10 Найти цитируемый пост)
mes, нет, такой код нашел в сети: http://it.kgsu.ru/C++/c0018.html пример 3.  

Цитата(Козьма Прутков)

Если на клетке слона прочтешь надпись "буйвол", не верь глазам своим. 


Это сообщение отредактировал(а) mes - 28.2.2009, 11:15


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0674 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.