Распределение адресов памяти C ++ - PullRequest
0 голосов
/ 02 июля 2019

Извинения я получил разочарование и отправил вопрос через мобильный без правильных подробностей

Рассмотрим следующий код C ++:

 int arr[2];
    arr[0] = 10;
    arr[1] = 20;
   // cout << &arr;
    for (int i = 0; i < 2; i++)
    {
       cout << &arr + i << "\t\t"<<endl;
    }

    cout << sizeof (arr);

вклю- чение отпечатков петли после

0x7ffeefbff580 0x7ffeefbff588

, что на 8 байт дальше, чем первый элемент

Мой вопрос: почему на 8 байтов больше, а не на 4 байта, если на моей машине sizeof (int) равно 4?

1 Ответ

5 голосов
/ 02 июля 2019

Теперь, когда вы дали нам код, мы можем ответить на ваш вопрос.

Итак, запутанная часть такова: &arr + i. Это не делает то, что вы думаете, что делает. Помните, что & имеет приоритет над +. Итак, вы берете адрес arr и перемещаете его вперед i раз.

Арифметика указателей работает таким образом, что &x + 1 перемещает указатель вперед на size(x). Так в вашем случае что такое size(arr)? Это 8, потому что это 2-элементный массив целых чисел (я предполагаю, что целые имеют размер 4). И поэтому &arr + 1 фактически перемещает указатель на 8 байтов вперед. Точная вещь, которую вы испытываете. Вы не запрашиваете следующий int, вы запрашиваете следующий массив . Я рекомендую вам поиграть, например, определите arr как int[3] (размером 12) и посмотрите, как указатель перемещается на 12 байтов вперед.

Итак, первое решение - сделать arr + i без &. Мы можем применить арифметику указателей к массиву, в этом случае он распадается на тип указателя int*. Теперь, когда int имеет размер 4, arr + 1 правильно указывает на сегмент памяти на 4 байта вперед.

Но я советую держаться подальше от арифметики с указателями и вместо этого делать &arr[i]. Это делает то же самое, но IMO менее подвержен ошибкам, менее запутан и говорит нам больше о намерениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...