Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
programina
2053 / 608 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
1

Капризный указатель О_о

25.06.2013, 10:30. Просмотров 1093. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2013, 10:30
Ответы с готовыми решениями:

Иероглифы в выводе и капризный SET_LOCALE
Здравствуйте, форумчане! Изучаю я СиПлюПлюс по книжке дяди Шилдта. Есть тут...

Как получить ссылку на указатель или указатель на указатель в массиве?
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как...

Функция, получающая указатель на обычную функцию, получает указатель на метод класса
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть...

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

Как правильно удалять выделенную память под указатель на указатель?
есть код #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt;...

27
Croessmah
++Ͻ
14776 / 8452 / 1605
Регистрация: 27.09.2012
Сообщений: 20,800
Записей в блоге: 2
Завершенные тесты: 1
25.06.2013, 10:33 2
Цитата Сообщение от programina Посмотреть сообщение
Почему при уходе в минус ~2500 и в плюс ~1500 программа завершается ошибкой?
Потому что лезет куда не положено


P.S. У меня ничего не падает
1
programina
2053 / 608 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
25.06.2013, 10:38  [ТС] 3
Цитата Сообщение от Croessmah Посмотреть сообщение
Потому что лезет куда не положено


P.S. У меня ничего не падает
То есть длина строки ограничена ~4000 байтами?
0
0x10
2579 / 1758 / 289
Регистрация: 24.11.2012
Сообщений: 4,391
25.06.2013, 10:42 4
@programina, да тут всего памяти выделено под 10(11) символов, все остальное - выход за границы.
1
programina
2053 / 608 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
25.06.2013, 10:46  [ТС] 5
@0x10, да, но разыменуются несколько тысяч, а затем что-то происходит.
0
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
25.06.2013, 10:48 6
@programina, UB. Просто UB и ничего более.
1
programina
2053 / 608 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
25.06.2013, 10:53  [ТС] 7
Цитата Сообщение от ForEveR Посмотреть сообщение
@programina, UB. Просто UB и ничего более.
мой пример кода не совсем удачный, но почему ж тогда несколько тысяч байтов не вызывают UB, если разыменовывать каждый цикл, а при превышении определенной границы UB. Такое чувство как будто здесь реализация вектора, у которого зарезервирован определенный обьем памяти.
0
Croessmah
++Ͻ
14776 / 8452 / 1605
Регистрация: 27.09.2012
Сообщений: 20,800
Записей в блоге: 2
Завершенные тесты: 1
25.06.2013, 10:56 8
Цитата Сообщение от programina Посмотреть сообщение
но почему ж тогда несколько тысяч байтов не вызывают UB
Потому что это UB

Добавлено через 35 секунд
Цитата Сообщение от programina Посмотреть сообщение
Такое чувство как будто здесь реализация вектора, у которого зарезервирован определенный обьем памяти.
и что из этого? За пределы вектора так же можно вылезти и это тоже UB
1
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
25.06.2013, 10:56 9
@programina, Что значит не вызывают? Доступ за пределы памяти массива - UB. Точка.
А что происходит на уровне выполнения, после того как по стандарту код стал некорректным - уже совсем другие вопросы и зависит от реализации компилятора/ОС/фазы луны и пр.
1
programina
2053 / 608 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
25.06.2013, 11:01  [ТС] 10
Цитата Сообщение от Croessmah Посмотреть сообщение
Потому что это UB

Добавлено через 35 секунд

и что из этого? За пределы вектора так же можно вылезти и это тоже UB
c++ такой с++

Добавлено через 3 минуты
@ForEveR, вечером еще раз посмотрю свой код, я точно помню, что они ВСЕГДА разыменовывались в определенном диапазоне без всяких UB.
0
Croessmah
++Ͻ
14776 / 8452 / 1605
Регистрация: 27.09.2012
Сообщений: 20,800
Записей в блоге: 2
Завершенные тесты: 1
25.06.2013, 11:03 11
Цитата Сообщение от programina Посмотреть сообщение
что они ВСЕГДА разыменовывались в определенном диапазоне без всяких UB.
просто взаимное расположение Нептуна и Плутона не менялось
1
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.06.2013, 11:13 12
Цитата Сообщение от programina Посмотреть сообщение
они ВСЕГДА разыменовывались в определенном диапазоне без всяких UB
просто UB в данном случае проявляется так: "пока ушли не далеко от выделенной памяти, падения нет, но читаем мусор. Уходим чуть дальше - ОС выявляет доступ к запрещенной памяти, и завершает прогу".
1
programina
2053 / 608 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
25.06.2013, 11:20  [ТС] 13

Не по теме:

@Croessmah, подожду стандарта c++211 :D



Добавлено через 3 минуты
@Tulosba, а не знаете по какому принципу можно просканировать всю остальную память?

Добавлено через 1 минуту
например у меня запущен текстовый редактор, я хочу отыскать в памяти название открытого в нем файла.
0
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.06.2013, 11:23 14
Цитата Сообщение от programina Посмотреть сообщение
например у меня запущен текстовый редактор, я хочу отыскать в памяти название открытого в нем файла.
Т.е. Вы хотите сканировать память другого процесса, так?
0
programina
2053 / 608 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
25.06.2013, 11:40  [ТС] 15
Цитата Сообщение от Tulosba Посмотреть сообщение
Т.е. Вы хотите сканировать память другого процесса, так?
да, вроде этого.

Добавлено через 13 минут
Никто не знает?
0
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.06.2013, 11:43 16
Я таким не занимался. Знаю раньше была популярная программка для геймеров ArtMoney. Для сканирования памяти процесса игры и накручивания себе скилла.
1
Croessmah
++Ͻ
14776 / 8452 / 1605
Регистрация: 27.09.2012
Сообщений: 20,800
Записей в блоге: 2
Завершенные тесты: 1
25.06.2013, 11:44 17
Цитата Сообщение от programina Посмотреть сообщение
да, вроде этого.
В винде есть для этого API
1
Croessmah
25.06.2013, 11:47
  #18

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Знаю раньше была популярная программка для геймеров ArtMoney.
Почему была? Она и сейчас есть:
Капризный указатель О_о

1
Tulosba
25.06.2013, 11:50
  #19

Не по теме:

@Croessmah, о, нет, меня похакали ... :D

0
programina
2053 / 608 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
25.06.2013, 11:50  [ТС] 20
мне под линукс надо.
0
25.06.2013, 11:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2013, 11:50

Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель
Всем привет, встретил в книге такой пример добавления узла в дерево: typedef...

Зачем нужен указатель на указатель при работе с однонаправленным списком?
День добрый. Столкнулся с непониманием этой темы. В частности, совершенно...

Объяснить работу функции, возвращающей указатель на указатель на char
Добрый день! Сможете объяснить что означает запись char **InputFile(int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru