|
시환님이 설명해주신거에 덧붙여서 멋진남자님의 코드를 최대한 덜 수정하도록 한다면..
원래 코드에 void CreateA(int *a) 함수를 void CreateA(int *&a) 로 변경하셔도 동작됩니다.
'&'참조변수를 사용했을때와 그냥 했을때의 차이를 생각해보시면 왜 오류가 났었는지 금방 알아차리실겁니다.
김시환 님이 쓰신 글 :
: 멋진남자 님이 쓰신 글 :
: : 배열 포인트를 함수인자로 넘겼는데 에러발생하네요??
: :
: : void CreateA(int *a)
: : {
: : a = new int[10];
: : for(int i=0; i<10; ++i){
: : a[i] = i;
: : }
: : }
: :
: : void main()
: : {
: : int *m_a;
: :
: : CreateA(m_a);
: :
: : for(int i=0; i<10; ++i){
: : cout<<m_a[i]<<" "; <<============= 에러발생
: : }
: : }
: :
: : 제가 뭘 잘 못 이해하고 코딩한건 가요??
: :
: : 에러 좀 잡아주세요. 부탁드립니다.
:
:
:
: int * a <---- 이 상태에서는 a 라는 포인터 변수의 실제 어드레스가 잡히지 않습니다.
: a = new int[10] <--- 이렇게 객체를 생성해 주어야 비로소 어드레스 할당이 되는 것입니다.
:
: 따라서 Main에서 설정한 m_a 변수는 실제 어드레스가 할당이 되지 않은 상태에서 서브함수의 파라메타로 넘어가기
: 때문에 서브함수의 파라메타에서 할당된 실제 어드레스가 메인함수의 변수로 적용이 되지 않는 것입니다.
:
: 아래처럼 실제 할당된 어드레스를 함수의 리턴으로 주어서 그것을 다시 받아서 사용하면 됩니다.
:
: int* CreateA()
: {
: int *a ;
: a = new int[10];
:
: for(int i=0; i<10; ++i)
: {
: a[i] = i;
: }
: return a ;
: }
:
: int main(int argc, char* argv[])
: {
: int *m_a ;
: m_a = CreateA();
:
:
: for(int i=0; i<10; i++)
: {
: cout << m_a[i] << " ";
: }
: }
|