Некоторые программисты на C или C++ с удивлением обнаруживают, что даже сохранение недопустимого указателя это неопределенное поведение. Однако для массивов кучи или стека можно хранить адрес единицы после конца массива, что позволяет сохранять «конечные» позиции для использования в циклах.
Но это неопределенное поведение для формирования диапазона указателей из одной переменной стека, например:
char c = 'X';
char* begin = &c;
char* end = begin + 1;
for (; begin != end; ++begin) { /* do something */ }
Хотя приведенный выше пример довольно бесполезен, он может быть полезен в том случае, если какая-то функция ожидает диапазон указателя, и у вас есть случай, когда у вас просто есть одно значение для его передачи.
Это неопределенное поведение?
int* ptr; int** ptr2 = &ptr
хранит адрес недопустимого указателя. Это УБ? И если вы имеете в виду, что у нас не может быть указателей на недействительную память, то откуда у нас могут быть указатели наNULL
? - person Seth Carnegie   schedule 02.02.2012int* ptr; int* ptr2 = &ptr
даже не компилируется, потому что типptr2
не совпадает. Кроме того,nullptr
является особым случаем. - person Mankarse   schedule 02.02.2012int** ptr2 = &ptr
не указывает на недопустимый адрес. Он указывает на переменную указателя, выделенную в стеке. - person Channel72   schedule 02.02.2012int* ptr = (int*)0x12345678;
UB? (не уверен, что гипс нужен) - person Seth Carnegie   schedule 02.02.2012ptr == 0
является неопределенным поведением, еслиptr
является недопустимым указателем. - person James Kanze   schedule 02.02.2012struct { int *p; } foo,bar;
, операторbar = foo;
может быть безопасно вызван независимо от того, содержит лиfoo
действительный указатель. Еслиfoo
содержит недопустимый указатель, присваивание приведет к тому, чтоbar
сделает то же самое, а попытка использоватьbar.p
вызовет неопределенное поведение. Насколько я понимаю, могут быть некоторые разногласия по поводу того, потребуется лиfoo = bar;
копировать что-либо в случае, еслиbar
известно как недействительное; Я думаю, что это необходимо сделать, если какой-либо код может... - person supercat   schedule 04.07.2015memcmp
для сравненияfoo
с указателем, время жизни которого перекрывает время жизниbar.p
, но я не думаю, что это представление является общедоступным. - person supercat   schedule 04.07.2015