0 / 0 / 0
Регистрация: 28.03.2015
Сообщений: 32
1

Особенность указателей

12.07.2020, 18:24. Показов 3730. Ответов 66
Метки нет (Все метки)

Всем привет, есть вот такой код:
C++
1
2
3
4
5
6
7
8
        
char* s1 = new char[5];
strcpy_s(s1, 5, "some");
char* s2 = s1;
delete s1;
if (s1 == s2) {
    cout << "true ???" << endl;
}
Собственно вопрос - гарантируется ли что после delete значение в s1 сразу-же изменится или это зависит от конкретной операционной системы ?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.07.2020, 18:24
Ответы с готовыми решениями:

Почему в сортировке указателей на объекты в вызове функции используются адреса объектов, а не указателей?
Доброго времени суток! Рассматриваю пример (из Лафоре) сортировки массива указателей на объекты,...

Объяснить различия в работе указателей на целое число и указателей на const char (строки в стиле Си)
Уважаемые программисты, возникло несколько вопросов касательно указателей. Почему при выводе...

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и...

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество...

66
Модератор
Эксперт CЭксперт С++
5104 / 4533 / 854
Регистрация: 07.10.2015
Сообщений: 9,463
13.07.2020, 15:53 41
Цитата Сообщение от hoggy Посмотреть сообщение
адрес можно преобразовать в число
Как и число привести к адресу

Добавлено через 2 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
это - некорректное высказывание
Может и некорректно
Я хотел сказать, что адресу присваивается приведенное к адресу число.
При обратном приведении к числу получим то же самое число
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.07.2020, 15:57 42
Цитата Сообщение от liv Посмотреть сообщение
Я хотел сказать, что адресу присваивается приведенное к адресу число.
При обратном приведении к числу получим то же самое число
У TRam_ пока не получилось это доказать. Думаешь, у тебя получится?
0
Модератор
Эксперт CЭксперт С++
5104 / 4533 / 854
Регистрация: 07.10.2015
Сообщений: 9,463
13.07.2020, 16:07 43
argcargv, сам проверь: присвой указателю просто число. Потом расскажешь...
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.07.2020, 16:09 44
Цитата Сообщение от liv Посмотреть сообщение
сам проверь
С таким подходом в детсад.
Доказательство — это стандартом (ну и документацией к реализации, если поведение помечено как implementation-defined).
0
Эксперт С++
8719 / 4262 / 950
Регистрация: 15.11.2014
Сообщений: 9,669
13.07.2020, 16:09 45
Цитата Сообщение от liv Посмотреть сообщение
Я хотел сказать, что адресу присваивается приведенное к адресу число.
это тоже некорректное высказывание.
поскольку "приведенное к адресу число" не является числом.

адресу присваивается адрес, а не число.
0
Модератор
Эксперт CЭксперт С++
5104 / 4533 / 854
Регистрация: 07.10.2015
Сообщений: 9,463
13.07.2020, 16:14 46
hoggy, хорошо, скажите, как назвать приведенное здесь

Добавлено через 2 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
поскольку "приведенное к адресу число" не является числом
Ох, придираетесь
Если так: адресу присваивается адрес, полученный после приведения числа к адресу.
Я просто немного сократил, т.к. приведенное к адресу число перестает быть числом.
0
Эксперт С++
8719 / 4262 / 950
Регистрация: 15.11.2014
Сообщений: 9,669
13.07.2020, 16:18 47
Цитата Сообщение от liv Посмотреть сообщение
как назвать приведенное
данное "приведенное" называется "приведением" ))


делается это просто:

1.
в одну руку ты берешь обычное число.

2.
в другую руку берешь стандарт.

что-то вроде этого:
Цитата Сообщение от TRam_ Посмотреть сообщение
A value of integral type or enumeration type can be explicitly converted to a pointer.
3.

Цитата Сообщение от argcargv Посмотреть сообщение
Доказательство — это стандартом
далее со всего размаху бъёшь книжкой этому троллю по башке.

4.
и наконец пишешь обычное приведение.
в данном случае - в стиле си.

5.
PROFIT???!!!!
0
Модератор
Эксперт CЭксперт С++
5104 / 4533 / 854
Регистрация: 07.10.2015
Сообщений: 9,463
13.07.2020, 16:22 48
argcargv, скажите свое мнение, приведите выдержку из стандарта... Посмотрим...

Добавлено через 1 минуту
argcargv, ну вот, читайте выше... Могу еще раз процитировать:
Цитата Сообщение от hoggy Посмотреть сообщение
A value of integral type or enumeration type can be explicitly converted to a pointer.
0
Эксперт С++
8719 / 4262 / 950
Регистрация: 15.11.2014
Сообщений: 9,669
13.07.2020, 16:23 49
Цитата Сообщение от liv Посмотреть сообщение
Я просто немного сократил, т.к. приведенное к адресу число перестает быть числом.
суть в русском языке.
в русском языке есть существительное - центральный предмет послания.
и есть всякого рода прилагательные - характеристики этого центрального предмета.

в предложении: "адресу присваивается приведенное к адресу число"
существительным является слово "число".

на самом же деле, адресу присваивается не "какое-то число", а вообще - не число.
адресу присваивается адрес.
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.07.2020, 16:27 50
Цитата Сообщение от liv Посмотреть сообщение
скажите свое мнение
У меня факты, а не мнение. Мнение у тебя, т.к. ничем не обосновано.
Выдержка из стандарта уже была:
Цитата Сообщение от TRam_ Посмотреть сообщение
mappings between pointers and integers are otherwise implementation-defined
Дальше надо лезть в документацию к каждой реализации и смотреть, что там написано. Как я уже говорил, в GCC каст целого к указателю это UB, за исключением случая когда это целое было ранее получено кастом из указателя.

Добавлено через 1 минуту
Цитата Сообщение от liv Посмотреть сообщение
ну вот, читайте выше... Могу еще раз процитировать
Я знаю, что у hoggy мозгов не хватает прочитать дальше первого предложения, но ты-то зачем на его уровень спускаешься?
0
Модератор
Эксперт по электронике
8698 / 6496 / 879
Регистрация: 14.02.2011
Сообщений: 22,721
13.07.2020, 16:27 51
Цитата Сообщение от hoggy Посмотреть сообщение
а вообще - не число.
адресу присваивается адрес.
адрес выраженный числом
в компьютерном мире все суть число
я что то не встречал таких таких адресов " главный блок, третья планка памяти, 128 ячейка"
0
Модератор
Эксперт CЭксперт С++
5104 / 4533 / 854
Регистрация: 07.10.2015
Сообщений: 9,463
13.07.2020, 16:35 52
Цитата Сообщение от hoggy Посмотреть сообщение
адресу присваивается адрес
Ну это и ежу понятно И это ПОДРАЗУМЕВАЕТСЯ.
Я в своей практике допускаю иногда такие вольности в интерпретации. При этом суть воспринимается всегда правильно
Может быть это из-за того, что учил языки самостоятельно, больше практическим программированием.

Добавлено через 4 минуты
Цитата Сообщение от argcargv Посмотреть сообщение
в GCC каст целого к указателю это UB
И что теперь, не писать программы под контроллеры? Там везде так! Причем по-другому никак!

Добавлено через 1 минуту
Цитата Сообщение от argcargv Посмотреть сообщение
мозгов не хватает прочитать дальше первого предложения
И давайте не будем хамить...
0
Модератор
Эксперт по электронике
8698 / 6496 / 879
Регистрация: 14.02.2011
Сообщений: 22,721
13.07.2020, 16:35 53
Цитата Сообщение от argcargv Посмотреть сообщение
в GCC каст целого к указателю это UB,
UB это "неопределенное поведение" на одной платформе так а на другой этак, с переносимостью плохо
но запись адреса числом это для конкретной платформы и компилятор для него тоже соответственный, ни о какой переносимости речи не идет
да и как писать переносимо обращение к порту ВВ для IBM PC и для Apple Macintosh?
0
Эксперт С++
8719 / 4262 / 950
Регистрация: 15.11.2014
Сообщений: 9,669
13.07.2020, 16:38 54
Цитата Сообщение от ValeryS Посмотреть сообщение
адрес выраженный числом
в компьютерном мире все суть число
это - демагогия.
с таким же успехом можно сказать: адрес, выраженный электронами, протонами и атомами.
в компьютерном мире (да и вообще, просто в мире) всё - суть электроны, протоны и атомы.


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

Цитата Сообщение от ValeryS Посмотреть сообщение
я что то не встречал таких таких адресов " главный блок, третья планка памяти, 128 ячейка"
возьми и напиши свой собственный компилятор.
и будут у тебя адреса и в главных блоках, и в каких нибудь ещё попугаях.
какие проблемы?

стандарт тебя в этом никак не ограничивает.

только не забудь реализовать преобразования: "integer <--> pointer"
0
Модератор
Эксперт по электронике
8698 / 6496 / 879
Регистрация: 14.02.2011
Сообщений: 22,721
13.07.2020, 16:57 55
Цитата Сообщение от hoggy Посмотреть сообщение
адрес - это черный ящик.
ты не можешь закладываться на то, как он может быть устроен внутри.
это пока пишешь нетленки на века
а когда низкоуровневое программирование железа, то очень даже закладываешься, или сам, или разработчики железа предоставляют свои SDK, где так же закладываются
Цитата Сообщение от hoggy Посмотреть сообщение
возьми и напиши свой собственный компилятор.
и будут у тебя адреса и в главных блоках, и в каких нибудь ещё попугаях.
какие проблемы?
стандарт тебя в этом никак не ограничивает.
только не забудь реализовать преобразования: "integer <--> pointer"
могу только зачем мне из integer делать каких то "попугаев" чтобы потом опять преобразовывать в integer, если все это лежит в чистом виде
0
Модератор
Эксперт CЭксперт С++
5104 / 4533 / 854
Регистрация: 07.10.2015
Сообщений: 9,463
13.07.2020, 17:06 56
Цитата Сообщение от ValeryS Посмотреть сообщение
а когда низкоуровневое программирование железа, то очень даже закладываешься
Это точно! Говорю, как также "железячный" программист
Но все же просто число формально не может быть адресом. Только после каста. Программа пишется под конкретную платформу,
поэтому проблема UB - это не проблема Речь идет о Си, разумеется.
Когда пишу на Асме, то жонглирую числами и адресами, как мне хочется
0
2279 / 777 / 298
Регистрация: 10.02.2018
Сообщений: 1,813
13.07.2020, 17:14 57
Цитата Сообщение от argcargv Посмотреть сообщение
Как я уже говорил, в GCC каст целого к указателю это UB
А это точно?
Поисковик мне выдаёт какие-то темы с обсуждением ворнингов (int-to-pointer). Основная проблемы, как я понял, что под 64 битные ОС int занимает 32 бита и там эта операция некорректна. Так подобный ворнинг есть не только в GCC.
0
Эксперт С++
8719 / 4262 / 950
Регистрация: 15.11.2014
Сообщений: 9,669
13.07.2020, 17:20 58
Цитата Сообщение от liv Посмотреть сообщение
число формально не может быть адресом
почему не может то?
может)))

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
могу только зачем мне из integer делать каких то "попугаев" чтобы потом опять преобразовывать в integer, если все это лежит в чистом виде
не важно "зачем", важно что "можешь".
суть в том, что всё "это" вовсе не обязано лежать всегда и везде в чистом виде.
0
Модератор
Эксперт CЭксперт С++
5104 / 4533 / 854
Регистрация: 07.10.2015
Сообщений: 9,463
13.07.2020, 17:27 59
Цитата Сообщение от hoggy Посмотреть сообщение
почему не может то?
Я об этом:
C
1
int* a = 0x80000000;
Ошибка компиляции

Добавлено через 3 минуты
hoggy, Опять моя упрощенная формулировка
Просто число не может быть присвоено указателю...
1
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.07.2020, 18:07 60
Цитата Сообщение от liv Посмотреть сообщение
И что теперь, не писать программы под контроллеры?
Можно не пользоваться GCC. Или забить на UB.
Цитата Сообщение от ValeryS Посмотреть сообщение
но запись адреса числом это для конкретной платформы и компилятор для него тоже соответственный
Да, поэтому в стандарте указано, что результат каста целого к указателю implementation-defined.
Цитата Сообщение от Ygg Посмотреть сообщение
А это точно?
Описание implementation-defined поведения в C++ для общих с C и C++ тем, к которым относится и поведение при касте между целыми и указателями, отсылает к описанию implementation-defined поведения в C, где сказано:
Цитата Сообщение от https://gcc.gnu.org/onlinedocs/gcc/Arrays-and-pointers-implementation.html
When casting from pointer to integer and back again, the resulting pointer must reference the same object as the original pointer, otherwise the behavior is undefined. That is, one may not use integer arithmetic to avoid the undefined behavior of pointer arithmetic as proscribed in C99 and C11 6.5.6/8.
Вот, можно кастить указатель к целому и обратно. Всё остальное, в том числе каст целого, которое не было получено кастом из указателя, к указателю ­— UB.
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.07.2020, 18:07
Помогаю со студенческими работами здесь

Различия указателей char* от указателей других типов
Помогите пожалуйста разобраться! Прочитал раздел про указатели и даже вроде бы понял. Что...

Как обойтись без указателей и указателей на указатель?
Ибо не совсем выходит понять,что на что тут указывает #include &quot;stdafx.h&quot; #include &lt;iostream&gt;...

Создание массивов указателей на массивы указателей
Помогите в решении задачи: создал массив указателей на массивы указателей на строки, но компилятор...

Особенность циклов в c++
Здравствуйте , я новичек в программировании, поэтому могу чего-то не знать. Сегодня я заметил...

Добавление нового указателя в конец массива указателей, удаление указанного элемента, добавление указателей
Здравствуйте. Помогите, пожалуйста, разобраться с одним большим заданием. Задание пока в процессе...

Особенность объявления функции
Собсно вопрос такой , зачем нужно объявлять функции если их можно просто определять? связано ли это...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru