Проблема с указателями на распределение памяти - PullRequest
0 голосов
/ 29 апреля 2019

Учитывая следующий блок кода:

  Byte* b = (Byte*) var.rawBuffer();
  b += sizeof (Byte) * 9;
  WhateverType* aptr = (WhateverType*) b;
  WhateverType* anotherptr = aptr;
  for (int i = 0; i < N; i++) {
    assert(*anotherptr == aptr[i]);
    anotherptr += sizeof (WhateverType);
  }

Почему утверждение иногда не удается?Не сканируется ли выделенная память с использованием оператора [] с индексом начального адреса памяти, эквивалентным увеличению адреса указателя на размер типа данных, которые я пытаюсь прочитать?

1 Ответ

1 голос
/ 29 апреля 2019

Проблема в этой строке:

anotherptr += sizeof (WhateverType);

anotherptr - это указатель WhateverType*, а не Byte*. Когда вы выполняете арифметику с типизированным указателем, общее количество байтов является четным кратным типу, который указатель объявлен как.

Итак, в приведенной выше строке вы не говорите компилятору увеличивать указатель всего на sizeof (WhateverType) только на количество байтов, как вы ожидаете. Вы на самом деле говорите ему увеличить указатель на sizeof(WhateverType) количество элементов или, другими словами, на sizeof(WhateverType) * sizeof(WhateverType) количество байтов.

T *pointer = ...;
pointer += N;

Фактически эквивалентно следующему:

pointer = reinterpret_cast<T*>(reinterpret_cast<byte*>(pointer) + (sizeof(T) * N));

Даже выражение aptr[i] работает так же, как выражение pointer[N] - это просто синтаксический сахар для *(pointer + N).

Для того, что вы пытаетесь, вам нужно увеличить указатель anotherptr на элемент N=1, а не на N=sizeof(WhateverType) количество элементов. Итак, используйте это вместо:

anotherptr += 1;

или проще:

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