доступ по индексу после * ptr1 ++ = * ptr2 ++ - PullRequest
1 голос
/ 20 февраля 2012

Вот так выглядит мой код:

int main()
{
    int a[] = {1,23,5,56,7,5};
    int *p2 = a;
    size = sizeof(a)/sizeof(a[0]);
    int *p1 = new int[size];

    cout << "sizeof " << size << endl;
    int i = 0;
    while(p2 != a+size )
    {
        *p1++ = *p2++;
    }
    cout << p1[1] << ' ' << p1[3];
    return 0;
}

cout << p1[1] << ' ' << p1[3]; выводя значения, которые не совпадают с значениями в [1] и [3]Может кто-нибудь объяснить мне, почему это происходит?

Ответы [ 4 ]

4 голосов
/ 20 февраля 2012

Ваш while цикл изменяет p1. После завершения цикла p1 будет указывать на конец нового массива (фактически, он будет указывать на следующую позицию после конца). Для решения проблемы сохраните копию оригинала p1.

int *p = p1;
while(p2 != a+size )
{
    *p1++ = *p2++;
}
p1 = p;
cout << p1[1] << ' ' << p1[3];
3 голосов
/ 20 февраля 2012

Вам нужно сбросить p1 до начала исходного массива.

1 голос
/ 20 февраля 2012

Вы должны сбросить p1 перед доступом к элементам:

int main()
{
  int a[] = {1,23,5,56,7,5};
  int *p2 = a;
  int size = sizeof(a)/sizeof(a[0]);
  int *p1 = new int[size];

  cout << "sizeof " << size << endl;
  int i = 0;
  while(p2 != a+size )
  {
     *p1++ = *p2++;
  }
  p1 -= size;
  cout << p1[1] << ' ' << p1[3];
  return 0;
}
1 голос
/ 20 февраля 2012

После цикла p1 указывает на конец выделенного буфера, а не на начало, так как на каждой итерации он увеличивается.

Вы должны попробовать что-то вроде этого:

int *p1 = new int[size];

int *begin = p1; //store the beginning of the array
while(p2 != a+size )
{
    *p1++ = *p2++;
}
p1 = begin; //reset to the begin again

//now print!
cout << p1[1] << ' ' << p1[3];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...