본문 바로가기

내가 꾸는 꿈

포인터#4 [노베이스 게임개발 18일차]

반응형

먼저 지난 시간의 과제를 먼저 풀어보았다.

 

*사용자로부터 숫자를 입력받아 배열의 동적할당을 활용해 입력받은 숫자만큼의 크기를 갖는 배열을 만들고 해당 배열에 2, 4, 6, 8...로 증가하는 수열을 저장한 뒤 배열을 출력하세요.

 

 

먼저 헤더파일을 만들어 주고 myArray를 포인터 데이터타입으로 선언해 주고 myArray를 input의 크기에 따라 가변적으로 변하게끔 동적할당을 해주었다.

 

나머지는 간단하게 for구문을 통해 입력받은 수만큼 2를 곱하여 수열을 만들어 저장해 주고 그 값을 하나씩 출력시키면 완성이다.

 

 

20의 값을 넣어주었을 때 20개의 배열이 만들어졌고 그 2의 배수인 수열 또한 출력이 되었다.

 

한 가지 놓친 부분이 있었는데 그것은 동적할당을 마친 후 그 값을 해제해 주어야 했다.

그래서 마지막 줄에 free(myArray); 을 통하여 메모리를 해제해 주면 완벽한 프로그램이 된다.

 

 

 

오늘은 여러 가지 포인터의 개념들에 대한 내용을 공부하였다.

 

포인터에는 주소값이 들어가는데 처음에는 초기화되지 않은 주소값이 들어가는데 이를 쓰레기 주소값이라고 보통 부른다.

변수를 만든 후 변수에 쓰레기 값이 들어갔을 때 초기화되지 않아서 생긴 건지 코드의 진행 중에 생긴 건지 알 수가 없으므로 프로그래머들은 보통 변수의 선언 이후 제로벨류로 값을 지정해 준다.

 

 

 

5번째 줄처럼 일반 변수들이 0으로 값을 맞춰주는 것처럼 포인터 또한 6번째 줄처럼 0-value를 설정해 주면 된다.

실제 0-value를 갖는지 확인하기 위한 조건문을 만든 후 실행하면

 

 

실제로 0-value가 된 것을 볼 수 있다.

 

그런데 여기에서 포인터에서 0 값의 표준 표현은 nullptr이다.

 

 

 

 

이 부분부터 이해가 되지 않아 책도 여러 권 읽어보고 강의도 여러 강의를 들어보다가 요즘 유행한다는 chat gpt를 한번 사용해 보았는데 생각 이상으로 너무 잘 알려주었다.

 

일단 코드를 설명하면 pointer를 nullptr로 초기화시켜 주후 그 값을 동적할당을 하면 포인터가 실제 주소를 가리키고 있습니다를 출력하게 된다.

 

 

 

나는 이 부분이 이해되지 않았다. 포인터를 null값으로 만들어 주었는데 동적할당을 하면 힙 영역으로 가서 이 값이 null값인 것을 저장하지 않을까 생각한 것이다.

 

내가 이해한 내용을 설명해 보자면 pointer를 nullptr로 초기화해 주면 주소값 자체가 0이 된다.

그런데 동적할당을 하게 되면 변수가 힙 영역으로 가는데 이 간다는 표현이 힙 영역의 특정 주소값이 배정이 된다는 뜻이었다.

그래서 pointer가 0이 아닌 특정 주소값을 가지게 되는 것이다.

 

그렇다면 또다시 궁금증이 생겼다.

만약 이런 코드를 쓴다고 할 때 힙 영역에는 pointer가 null값이라는 것을 가지고 갈까?

 

이 부분이 궁금하여 chat gpt에게 물어보았다.

 

 

chat gpt에 의하면  nullptr은 아무것도 가리키지 않음을 표현한 것이고 동적할당을 하는 순간 주소값이 배정되어 무엇인가 가리키고 있으므로 애초에 질문이 잘못된 것이었다.

 

만약 동적할당한 pointer를 출력하게 되면 동적할당으로 얻은 메모리블록의 주소값이 나오게 된다.

그리고 동적할당을 하고 난 후 해제해 줄 때 이때 힙 영역에 있는 주소를 잃게 되면서 가지고 있던 값을 잃게 되는데 이때 다시 초기화를 해주어야 한다.

그렇지 않으면 쓰레기 값이 나오기 때문이다.

 

 

 

후기 : 포인터 부분에서 이해하지 못하고 넘어가다 보니 도저히 이해할 수 없는 부분들이 마구 나와 여러 책도 읽고 다른 강의도 들으며 처음부터 기초를 다졌다. 그리고 챗 gpt라는 좋은 도구 또한 알아내어서 이제 다시 블로그 연재에 시동을 걸 수 있게 되었다.

 

 

 

 

*본 포스팅은 학생의 입장에서 쓴 글로 정확하지 않을 수 있으며 댓글로 피드백해 주시면 감사하겠습니다.

클래스 101 개발자 라라 님의 강의를 통해 학습한 내용을 기반으로 두고 있습니다.

반응형