1 | |
Капризный указатель О_о25.06.2013, 10:30. Показов 1925. Ответов 27
Метки нет (Все метки)
Создаю указатель на байт, при помощник арифметических операций +/- перемещаю его в цикле. Почему при уходе в минус ~2500 и в плюс ~1500 программа завершается ошибкой?
Добавлено через 3 минуты C++ #include <iostream> int main() { char * b = "1234567890"; for ( int i = -2600 ; i < 1600 ; i ++ ) b ++ ; std::cout << *b << std::endl; }
0
|
25.06.2013, 10:30 | |
Ответы с готовыми решениями:
27
Иероглифы в выводе и капризный SET_LOCALE Капризный видеодрайвер! Капризный Scanner.nextLine() Капризный синтаксис Shell.Run |
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
25.06.2013, 10:42 | 4 |
@programina, да тут всего памяти выделено под 10(11) символов, все остальное - выход за границы.
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
25.06.2013, 10:48 | 6 |
@programina, UB. Просто UB и ничего более.
1
|
25.06.2013, 10:53 [ТС] | 7 |
мой пример кода не совсем удачный, но почему ж тогда несколько тысяч байтов не вызывают UB, если разыменовывать каждый цикл, а при превышении определенной границы UB. Такое чувство как будто здесь реализация вектора, у которого зарезервирован определенный обьем памяти.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
25.06.2013, 10:56 | 9 |
@programina, Что значит не вызывают? Доступ за пределы памяти массива - UB. Точка.
А что происходит на уровне выполнения, после того как по стандарту код стал некорректным - уже совсем другие вопросы и зависит от реализации компилятора/ОС/фазы луны и пр.
1
|
25.06.2013, 11:01 [ТС] | 10 |
c++ такой с++
Добавлено через 3 минуты @ForEveR, вечером еще раз посмотрю свой код, я точно помню, что они ВСЕГДА разыменовывались в определенном диапазоне без всяких UB.
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
25.06.2013, 11:13 | 12 |
просто UB в данном случае проявляется так: "пока ушли не далеко от выделенной памяти, падения нет, но читаем мусор. Уходим чуть дальше - ОС выявляет доступ к запрещенной памяти, и завершает прогу".
1
|
25.06.2013, 11:20 [ТС] | 13 |
Не по теме: @Croessmah, подожду стандарта c++211 :D Добавлено через 3 минуты @Tulosba, а не знаете по какому принципу можно просканировать всю остальную память? Добавлено через 1 минуту например у меня запущен текстовый редактор, я хочу отыскать в памяти название открытого в нем файла.
0
|
Croessmah
|
25.06.2013, 11:47
#18
|
1
|
Tulosba
|
25.06.2013, 11:50
#19
|
Не по теме: @Croessmah, о, нет, меня похакали ... :D
0
|
25.06.2013, 11:50 [ТС] | 20 |
мне под линукс надо.
0
|
25.06.2013, 11:50 | |
25.06.2013, 11:50 | |
Помогаю со студенческими работами здесь
20
Капризный зверь) Если не трудно прочтите до конца Как получить ссылку на указатель или указатель на указатель в массиве? А почему нельзя передавать в ф-ю добавления элемента в стек один указатель? Почему нужен именно указатель на указатель? Указатель типа void. Использование косвенного связывания через универсальный указатель Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |