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

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

12.07.2020, 18:24. Показов 3733. Ответов 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
2279 / 777 / 298
Регистрация: 10.02.2018
Сообщений: 1,813
13.07.2020, 18:13 61
Цитата Сообщение от argcargv Посмотреть сообщение
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
Вот, можно кастить указатель к числу и обратно. Всё остальное, в том числе каст числа, которое не было получено кастом из указателя, к указателю ­— UB.
В моём понимании английского тут написано другое, хотя я тот ещё спец по языку. Если каст туда и обратно дал исходный результат, то всё хорошо, а иначе плохо. По-моему тут всё же идёт речь про 64х битные системы и 32х битный инт.
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.07.2020, 18:18 62
Цитата Сообщение от Ygg Посмотреть сообщение
В моём понимании английского тут написано другое, хотя я тот ещё спец по языку. Если каст туда и обратно дал исходный результат, то всё хорошо, а иначе плохо.
Можно и так читать, и вполне возможно так даже правильнее. Но в итоге это ничего не меняет.
UB при касте вроде reinterpret_cast<T*>(0x######) тогда выходит неявным: нигде не описано, какой результат должен получиться. Стандарт говорит: "implementation-defined", implementation же ничего не определяет.
0
2279 / 777 / 298
Регистрация: 10.02.2018
Сообщений: 1,813
13.07.2020, 18:42 63
UB при касте вроде reinterpret_cast<T*>(0x######) тогда выходит неявным
Всё же в документации говорится о знаковом int и его преобразовании в указатель и обратно, а не о преобразовании числа как такового. "implementation-defined" тут скорее относится именно к int. Хотя числовая константа в коде неявно может считаеться интом и это может как-то сказываться. На ваш взгляд, есть ли UB при преобразовании size_t в указатель и обратно?

Добавлено через 5 минут
Хотя уже нашёл примеры конфигураций, для которых size_t не равен размеру указателя. Так что вопрос не актуален, это то же не всегда корректно.
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.07.2020, 18:43 64
Цитата Сообщение от Ygg Посмотреть сообщение
Всё же в документации говорится о знаковом int
???
integer/integral это любой целый тип, а не только int.
Ну или если ещё точнее, это
Цитата Сообщение от https://timsong-cpp.github.io/cppwp/n4659/basic.types#basic.fundamental-7
Types bool, char, char16_­t, char32_­t, wchar_­t, and the signed and unsigned integer types are collectively called integral types. A synonym for integral type is integer type.
0
Модератор
Эксперт CЭксперт С++
5104 / 4533 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
13.07.2020, 18:48 65
Цитата Сообщение от argcargv Посмотреть сообщение
Можно не пользоваться GCC. Или забить на UB.
Использую компилятор из семейства GCC, заточенный на ARM (arm-none-eabi-gcc) Никогда не было никаких проблем, даже предупреждений. Это компилятор такой "неправильный"?
Цитата Сообщение от argcargv Посмотреть сообщение
Да, поэтому в стандарте указано, что результат каста целого к указателю implementation-defined.
Ну хорошо хоть, что стандарт разрешает свою реализацию
0
2279 / 777 / 298
Регистрация: 10.02.2018
Сообщений: 1,813
13.07.2020, 19:25 66
Цитата Сообщение от liv Посмотреть сообщение
Никогда не было никаких проблем, даже предупреждений
Я так понял, что есть всякие экзотичные системы (например, IBM System i), для которых указатели могут быть крайне не стандартного размера.
The system's instruction set defines all pointers as 128-bit
Так же, вполне допускаю, что есть системы с нестандартными размерами знаковых типов. Скорее всего, стандарт пытается охватить все возможные системы и поэтому говорит весьма размыто о преобразовании указателей к числовым типам и их "implementation-defined". Так что пользуемся дальше, как и раньше, но на IBM наш код вряд ли заработает.
0
Модератор
Эксперт CЭксперт С++
5104 / 4533 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
13.07.2020, 19:30 67
Ygg, ARM на IBM? Не смешите мои тапочки
Впрочем, согласен, стандарт на то и стандарт, чтобы охватить все...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.07.2020, 19:30
Помогаю со студенческими работами здесь

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

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

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

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

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

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


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

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

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