Указатели на один и тот же адрес одного и того же типа имеют разные значения

У меня есть два указателя одного типа, указывающие на один и тот же адрес, но значения разные. что мне кажется довольно странным.

  • Это из-за неопределенного поведения?
  • Может ли программа соврать нам об адресах?

Редактировать: мне очень жаль, что я не заметил разницы между адресами, они отличаются второй цифрой справа.

#include <iostream>

int main()
{
  int* array = new int[]{1,2,3,4,5};
  int* p = array; 
  
  //delete[] array;
  array = new int[]{6,7,8,9,10};

  for(int i=0; i<5; i++)
  {
    std::cout << &(array[i]) << " => " << array[i] <<'\n';
    std::cout << &(p[i]) << " => " << p[i] <<'\n';
    std::cout << "--------------------\n";
  }
}

при комментировании массива «delete[]» вывод будет следующим:

0x55763f7bc2d0 => 6
0x55763f7bc2b0 => 1
--------------------
0x55763f7bc2d4 => 7
0x55763f7bc2b4 => 2
--------------------
0x55763f7bc2d8 => 8
0x55763f7bc2b8 => 3
--------------------
0x55763f7bc2dc => 9
0x55763f7bc2bc => 4
--------------------
0x55763f7bc2e0 => 10
0x55763f7bc2c0 => 5
--------------------

если не комментировать, значения, конечно, равны.

Нет, нет. Вы изменили одно, чтобы указать на что-то другое. Итак, у вас есть два указателя на разные адреса, имеющие разные значения.

Avi Berger 02.08.2024 03:32

После array = new int[]{6,7,8,9,10};, array и p указывают на две разные вещи.

songyuanyao 02.08.2024 03:32

Если вы раскомментируете массив «//delete[];» строка, то p остается висячим указателем, и разыменование его является неопределенным поведением до тех пор, пока вы не присвоите ему новое допустимое значение, чего вы никогда не делаете. массив также будет висеть до следующей строки: "array = new int[]{6,7,8,9,10};" где вы даете ему новое, допустимое значение. (Возможно, что новое значение соответствует тому, где находился старый, теперь удаленный массив, но на это нельзя рассчитывать.)

Avi Berger 02.08.2024 03:37

@songyuanyao, так почему &array[i] и &p[i] равны? разве это не означает, что они указывают на один и тот же адрес?

Fari Anderson 02.08.2024 03:42

@AviBerger, теперь это начинает иметь больше смысла :) спасибо

Fari Anderson 02.08.2024 03:47

@FariAnderson Нет, они разные.

songyuanyao 02.08.2024 03:59

Итак, вы неправильно прочитали вывод. ИМХО, сам вопрос - опечатка.

3CxEZiVlQ 02.08.2024 04:05

@3CxEZiVlQ исправь это, и я отредактирую, если смогу. спасибо

Fari Anderson 02.08.2024 04:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
8
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добро пожаловать в С++! Вообще ничего странного не происходит. Показанный результат — именно то, что можно было ожидать.

Когда создается новый массив, он возвращает указатель на первый элемент. Когда создается первый массив, переменная array указывает на 1. Затем создается переменная p и устанавливается равной array, так что в этот момент обе переменные имеют одинаковое значение и обе указывают на 1.

Затем создается новый массив, и значение указателя присваивается переменной array, которая затем указывает на 6. Переменная p не изменилась и по-прежнему указывает на 1.

Глядя на адреса &(array[i]) и &(p[i]), вы видите, что они, как и ожидалось, разные. Хотя «б» и «г» очень похожи, и мне пришлось минуту пристально смотреть на них, чтобы понять, что они разные.

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

Fari Anderson 02.08.2024 03:59

Не знаю, почему за это проголосовали. В основном это полезно, за исключением того, что следует упомянуть, что после delete[] array поведение p[i] не определено.

M.M 02.08.2024 05:03

Другие вопросы по теме