CS 기초/자료구조

[CS50] malloc과 포인터 복습

담크 2021. 8. 27. 15:10

오늘부터는 메모리의 다음 강좌인 자료구조에 대해 공부해보겠습니다. 평소에 공부하던 자바가 아닌 C라 조금 낯설긴 한데 그래도 다양한 데이터 구조를 공부해보는 건 좋은 거 같아요 오늘은 그중에서도 데이터 구조를 정리하는데 중요한 포인터와 메모리에 대한 개념을 한번 더 복습해보겠습니다.

 

아래와 같이 main 함수를 작성해보겠습니다.

int main(void)
{
    int *x;
    int *y;

    x = malloc(sizeof(int));

    *x = 42;
    *y = 13;
}

이 코드는 문제없이 정상적으로 작동할까요?? 아니라면 어느 부분이 문제가 될까요??

 

첫줄에 포인터를 이용해 x, y를 각각 선언해주었습니다.

그다음으로 x에는 malloc 함수를 이용해 int형의 사이즈에 해당하는 메모리를 할당합니다.

그리고 x에는 42를 y에는 13을 저장하게 되는데 문제는 여기서 발생합니다.

y는 포인터로만 선언되어있을뿐 어디를 가리킬지 즉 메모리가 할당되어있지 않습니다. 초기화되어있지가 않은 상태죠

초기화되어있지 않은 *y는 프로그램 어딘가를 임의로 가리키고 있을 수 있어 어딘지 모르는 그곳에 13을 저장한다는 것이 오류를 발생시키는 것입니다.

그렇다면 이 코드를 조금만 바꿔보겠습니다.

int main(void)
{
    int *x;
    int *y;

    x = malloc(sizeof(int));

    *x = 42;
     y = x;
    *y = 13;
}

이렇게 y가 x와 동일한 것을 가리키는 y = x; 코드를 추가해주면 y도 결국은 x와 같은 메모리를 할당받게 됩니다.

따라서 이때 *y = 13;으로 저장하게 되면 에러가 발생하지 않고 모든 코드가 정상 작동하게 됩니다.

(단 x가 가리키는 값과 y가 가리키는 값이 같으므로 x의 값도 13으로 바뀌어 저장되겠죠 ㅎㅎ)

 

결과론적으로 포인터는 초기화해주지 않으면 메모리 상의 어딘가(쓰레기 주소)를 가리키기 때문에 오류가 발생하게 되므로 항상 초기화 작업을 해줘야 합니다.


출처

본 내용은 CS50의 2019년 강의를 듣고 작성했습니다. (개념이 어느 정도 정리되면 최신강의도 다시 듣고 수정할 내용 있으면 수정하겠습니다.)

 

강의 자료는 EdX에서 무료로 사용할 수 있고 boostcourse에서 한글 강의로도 들을 수 있습니다.

'CS 기초 > 자료구조' 카테고리의 다른 글

[CS50] 연결리스트 : 트리  (0) 2021.09.01
[CS50] 연결리스트 : 시연  (0) 2021.08.31
[CS50] 연결리스트 : 코딩  (0) 2021.08.30
[CS50] 연결리스트 : 도입  (0) 2021.08.29
[CS50] 배열의 크기 조정하기  (0) 2021.08.28