2015-10-14 3 views
0

В этом проблема. Я пытаюсь создать диаграмму памяти, и я все понимаю до b ++, потому что, когда этот код выполняется, он меняет значение val от 10 до 4. В чем причина этого?Указатели и ссылки

#include <iostream> 

using namespace std; 
void mem(int*& a, int* b){ 
    a --; 
    b++; 
    a = new int[3]; 
    a[0] = 3; 
    a[1] = *b; 
    a[2] = ++(*b); 
} 
int main() 
{ 
    int data[] = {2, 4, 6, 8}; 
    int *ptrA = data; 
    for (int i = 0; i < 4; i ++){ 
     (*ptrA)++; 
     ptrA++; 
    } 
    int val = 10; 
    mem(ptrA, &val); 
} 
+0

Является ли знак амперсанда «void mem (int * & a, int * b)» преднамеренным? – dspfnder

ответ

0

b++; является приращение адреса, который держит b одним int после int адреса он имел.

После этого любое использование переменной не определено, поскольку мы теперь указываем на некоторую неопределенную память.

1

В вашем примере, b является указателем на целое число, и b++ задает указатель на приращение (т.е., указывает на следующее доступное целое число) таким же образом, как ptrA++. Однако разница состоит в том, что ptrA указывает на начало массива; мы все еще владеем памятью для следующего доступного целого числа, поэтому все в порядке. Для b он указывает на одно целое число; увеличивая его и пытаясь использовать его впоследствии, приводит к неопределенному поведению.