본문 바로가기

Education

[부스트 코딩 뉴비 챌린지 2020] week4 Q&A (2) : 배열 선언 시 주의점

반응형

Question

 

num1, num2 배열을 전역변수로 선언 후 num1[0]=1을 넣은 후에 두 배열값을 출력하니 num1값만 변하고 num2값은 00000으로 출력되어야 하는데 num2의 값도 함께 변화합니다.

처음에 선언할 때 값을 위와 같이 넣고 두 배열의 결과를 보아도 num2에 넣었던 값이 num1 배열안에 들어가는 것을 볼 수 있습니다.

왜 두 배열이 함께 변화할까요?

또한 위와 같이 int num1[5] = {};와 같이 배열의 크기를 정해주는 경우에 이러한 문제점이 사라집니다.

왜 크기를 정해주면 이 현상이 발생하지 않게 되는 걸까요?

 

(+) 위의 의문점을 불러온 미션01 작성 중에서 발생한 문제

  - 각 num1, num2 배열이 난수 5개를 차례대로 받는 경우 두 배열의 상태를 출력한 결과.

초기에 값을 주지 않은 경우 : 두 값이 동시에 변화함
초기에 num1[]={7}, num2[]={3} 으로 준 경우

 

Answer

배열을 선언할 때의 주의점과 포인터의 개념에 대해 말해주는 질문인 것 같습니다. 아래의 예시 코드를 보시기 바랍니다.

num1과 num2 배열의 크기도 정해지지 않았고 초기화도 되지 않았으므로, 서로 다른 이름으로 선언만 되었을 뿐 같은 공간(0xec6e0c)을 가리키고 있습니다.

num3배열의 크기도 정해졌고 초기화도 되었으므로, 앞의 공간과는 멀리 떨어진 다른 영역(0x635b50)에 저장되었습니다.

num4 num5는 앞의 경우와 마찬가지로 0xec6e0c를 중복하여 가리키고 있습니다.

num6은 초기화는 되지 않았지만 배열의 크기는 정해졌으므로 0xec6e0c부터 세 칸,  (3 int) * (4 byte / int) = 12byte의 공간을 차지하고 있습니다. 이는 num7 num8 0xec6e18을 가리킨다는 것에서 알 수 있습니다.

잘 이해되지 않는다면, 포인터 강의를 들은 후 다시 읽어보시면 감이 오실 것입니다.

요약하자면, num1과 num2의 배열의 크기를 정해주지도 않았고초기화하지도 않았기 때문에 서로 같은 메모리를 가리켜서 일어나는 현상입니다.

 

Recap

  배열크기 값 초기화 메모리 공간
num1 X X A
num2 X X A
num3 O O (2개) D (A와 멀리 떨어진 곳)
num4 X X A
num5 X X A
num6 O (4byte) X A ~ A+3
num7 X X A+4
num8 X X A+4

따라서 배열 크기를 정해주면 해당 크기만큼 메모리 공간을 확보하게 되므로 위에서 질문한 현상이 발생하지 않게 된다.

그러므로 앞으로 여러 배열을 선언할 때 {(배열의 크기 지정) || (값 초기화)} 를 해야 한다.

 

* 포인터 강의

 

[LECTURE] 2) 포인터 : edwith

들어가기 전에 앞서 배운 메모리 주소를 직접 관리하기는 쉽지 않을 수 있습니다. C에는 포인터 라는 개념을 통해서 변수의 주소를 쉽게 저장하고 접근할 수 있게 해줍니다. 포인터가 ... - 부스��

www.edwith.org

 

반응형