2013-08-29 3 views
0

우선, 정수형 포인터와 클래스 A을 정의합니다. 그것을 저장하는 A 메서드에 대한 포인터를 전달하고 싶습니다.정수를 저장하는 메모리 블록의 값이 반복적으로 변경되는 이유는 무엇입니까?

A 메서드를 호출하면 A 클래스의 정수 멤버가 항상 변경된다는 것을 알게되었습니다.

이러한 변경을 피하는 방법에 대해 혼란스러워합니다.

#include <IOSTREAM> 

using namespace std; 

class A 
{ 
private: 
    int* a; 
public: 
    A() 
    { 

    }; 
    ~A() 
    { 

    }; 

void setA(int n) 
{ 
    cout << "n == " << n << "&n == " << &n << endl; 
    a = &n; 
    cout << "now a== " << a << endl; 
} 

void PassA(int* &outint) 
{ 
    cout << "a == " << a << " *a == " << *a <<endl; 
    outint = a; 
    cout << "outint = " << outint << endl; 
} 

void Print() 
{ 
    cout << "a ==================== " << a << endl; 
    cout << "*a ==================== " << *a << endl; 
} 
}; 

int main() 
{ 
A A_1; 
int num = 5; 
    A_1.setA(num); 

    int *intb= NULL ; 
    A_1.PassA(intb); 
    //When the line above done,the value of A_1.a will change. 
    cout << "intb == " << intb << endl; 
    cout << "*intb ==" << *intb << endl; 
    cout << "num ==" << num << endl; 
A_1.Print(); 
return 0; 
} 

출력 :

 
n == 5&n == 0x28fe90 
now a== 0x28fe90 
a == 0x28fe90 *a == 2686708 
outint = 0x28fe90 
intb == 0x28fe90 
*intb ==4619604 
num ==5 
a ==================== 0x28fe90 
*a ==================== 4619604 
+0

할당 된만큼 메모리를 할당하는 방법에 대해 걱정할 이유가 무엇입니까? – Bill

+0

main()에서 정의한 포인터를 클래스 멤버 포인터가 가리키는 포인터와 동일한 주소로 만들고 싶습니다. –

+0

스택에있는 변수를 유지하는 것은 위험합니다 –

답변

1

당신은 스택에있는 값으로 메모리 위치를 설정한다. 메서드가 끝나면 스택 값은 무시됩니다. 당신이 당신의 자신의 메모리를 할당해야하는 경우, 그것은 새로운 사용하여 삭제하십시오

void setA(int n) 
{ 
    cout << "n == " << n << "&n will be different every time" << endl; 
    a = new int(); 
    *a = n; 
    cout << "now a== " << a << endl; 
} 

을 다른 방법으로, 호출자의 변수의 실제 주소를 사용하려는 경우, 당신은 int로 포인터를 전달하는 대신해야 int :

void setA(int* n) 
{ 
    cout << "n == " << *n << " &n = " << n << endl; 
    a = n; 
    cout << "now a== " << a << endl; 
} 
+0

두 번째 방법으로 내 문제를 해결했습니다. –

+1

'n'도 참조 일 수 있습니다. 그런 다음 해당 참조의 주소를 가져 오면 가리키는 변수의 함수 (아마도 호출자 함수)가 끝날 때까지 포인터가 유효하게됩니다. – icktoofay

+1

@ Andy.G이 문제를 해결하는 것 외에도 지역 변수가 스택에 할당되고 힙을 사용하여 변수를 동적으로 할당한다는 사실을 이해하는 것이 중요합니다. 기본 개념을 이해하므로 다음에 무슨 일이 일어나는지 알게됩니다. –

관련 문제