Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 28.03.2015
Сообщений: 32
1

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

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

Author24 — интернет-сервис помощи студентам
Всем привет, есть вот такой код:
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
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.07.2020, 12:02 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от TRam_ Посмотреть сообщение
и это будет абсолютно корректно с точки зрения синтаксиса и исполнения.
Это точно UB в GCC. (Про необходимость явно делать каст от целого к указателю я уже и не пишу)
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
13.07.2020, 12:03 22
Цитата Сообщение от argcargv Посмотреть сообщение
Можно сказать что поведение твоего кода зависит от реализации.
Поведение его кода определено, потому что там нет разыменования указателя. А вот получение значения разыменованного указателя , как в твоём параграфе и сказано, является неопределённым поведением, и это значит что зависит не только от реализации компиляторов, но и от текущего состояния системы/памяти / проч.
0
18843 / 9842 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
13.07.2020, 12:05 23
Цитата Сообщение от TRam_ Посмотреть сообщение
А вот получение значения , как в твоём параграфе и сказано, является неопределённым поведением
Вообще в его параграфе сказано про значение указателя, а не про значение указываемого объекта/указываемой памяти.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
13.07.2020, 12:43 24
Цитата Сообщение от TRam_ Посмотреть сообщение
char* s1 = 0x1234;
char* s2 = 0x4321;
cout << (s1==s2)<<endl;
и это будет абсолютно корректно с точки зрения синтаксиса и исполнения.
ты отдаёшь себе отчет в том, что пишешь:
"абсолютно корректно" в отношении фрагмента кода,
который вообще даже не компилируется?
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
13.07.2020, 12:53 25
Цитата Сообщение от alaksion Посмотреть сообщение
Проверил на большом массиве, пикрилл выполнялся всегда. Вот мне и стало интересно, зависит ли код от ОС / компилятора
Как ты вообще умудрился получить такой результат, на каком компиляторе?
https://wandbox.org/permlink/SncvcoFi7mSFRtn3
0
0 / 0 / 0
Регистрация: 28.03.2015
Сообщений: 32
13.07.2020, 13:02  [ТС] 26
oleg-m1973, Который с vs идет
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
13.07.2020, 13:14 27
Цитата Сообщение от alaksion Посмотреть сообщение
oleg-m1973, Который с vs идет
У тебя, видать, указана опция компилятора /sdl
If the /sdl (Enable additional security checks) compiler option is specified, the operand to the delete operator is set to an invalid value after the object is deleted.
https://docs.microsoft.com/en-... ew=vs-2019

Добавлено через 7 минут
Не стоит на неё рассчитывать
1
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
13.07.2020, 13:15 28
Цитата Сообщение от hoggy Посмотреть сообщение
"абсолютно корректно" в отношении фрагмента кода,
который вообще даже не компилируется?
Речь была о последней строке того кода. Конечно же нужно преобразование типа
C++
1
char* s1 = reinterpret_cast<char*>(0x1234);
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.07.2020, 13:19 29
Цитата Сообщение от TRam_ Посмотреть сообщение
Конечно же нужно преобразование типа
Ну и что же в результате получится?
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
13.07.2020, 13:37 30
argcargv, указатель с адресом. Который можно сравнивать с другими указателями, что собственно в коде и есть.
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.07.2020, 13:39 31
Цитата Сообщение от TRam_ Посмотреть сообщение
указатель с адресом
Можно увидеть подтверждение этим словам цитатами из стандарта?
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
13.07.2020, 14:15 32
https://timsong-cpp.github.io/... ootnote-88

(2.1)
If one pointer represents the address of a complete object, and another pointer represents the address one past the last element of a different complete object,88 the result of the comparison is unspecified.

(2.2)
Otherwise, if the pointers are both null, both point to the same function, or both represent the same address, they compare equal.

(2.3)
Otherwise, the pointers compare unequal.
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.07.2020, 14:21 33
TRam_, что это? Я спрашивал про reinterpret_cast<char*>(0x1234).
До сравнения ещё дожить надо.
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
13.07.2020, 14:36 34
argcargv, https://timsong-cpp.github.io/... rpret.cast

A value of integral type or enumeration type can be explicitly converted to a pointer. A pointer converted to an integer of sufficient size (if any such exists on the implementation) and back to the same pointer type will have its original value; mappings between pointers and integers are otherwise implementation-defined. [ Note: Except as described in [basic.stc.dynamic.safety], the result of such a conversion will not be a safely-derived pointer value.  — end note ]
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
13.07.2020, 14:42 35
Цитата Сообщение от argcargv Посмотреть сообщение
Про необходимость явно делать каст от целого к указателю я уже и не пишу
и не пиши
есть куча вещей где периферия лежит по конкретному адресу
например таймер 2 у stm-ки
TIM2

C
1
#define TIM2                ((TIM_TypeDef *)TIM2_BASE)
а перед этим
C
1
#define TIM2_BASE             (APB1PERIPH_BASE + 0x00000000U)
и еще
C
1
#define APB1PERIPH_BASE       PERIPH_BASE
и еще
C
1
#define PERIPH_BASE           0x40000000U /*!< Peripheral base address in the alias region */
файл stm32f103xb.h
и файлик то не самописный
******************************************************************************
* @file stm32f103xb.h
* @author MCD Application Team
* @version V4.2.0
* @date 31-March-2017
* @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File.
* This file contains all the peripheral register's definitions, bits
* definitions and memory mapping for STM32F1xx devices.
*
* This file contains:
* - Data structures and the address mapping for all peripherals
* - Peripheral's registers declarations and bits definition
* - Macros to access peripheralӳ registers hardware
*
******************************************************************************
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.07.2020, 14:44 36
TRam_, такс. Ну и где там получается
Цитата Сообщение от TRam_ Посмотреть сообщение
указатель с адресом
???
0
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
13.07.2020, 15:10 37
ValeryS, ну так
C
1
#define TIM2                ((TIM_TypeDef *)TIM2_BASE)
Это и есть приведение к адресу TIM_TypeDef * Всё остальное числовые константы.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
13.07.2020, 15:38 38
Цитата Сообщение от liv Посмотреть сообщение
Это и есть приведение к адресу TIM_TypeDef *
приведение!
но адрес то задается числом, целым
отвечал я на это
Цитата Сообщение от argcargv Посмотреть сообщение
Про необходимость явно делать каст от целого к указателю я уже и не пишу
0
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
13.07.2020, 15:43 39
Цитата Сообщение от ValeryS Посмотреть сообщение
но адрес то задается числом, целым
Не совсем так. Адрес численно равен числу, да, но по сути TIM2 - это адрес структуры TIM_TypeDef, а не просто число. И без приведения работать не будет.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
13.07.2020, 15:47 40
Цитата Сообщение от liv Посмотреть сообщение
Адрес численно равен числу
это - некорректное высказывание.

адрес можно преобразовать в число.
однако сам адрес при этом числом не является.
0
13.07.2020, 15:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.07.2020, 15:47
Помогаю со студенческими работами здесь

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru