![[CS50] 자료구조 - malloc과 포인터 복습](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu4THG%2FbtsH3msyGNO%2FKT7jZFwXalh5MCG7g5qw31%2Fimg.jpg)
아래와 같은 main
함수 코드가 있다. 여기서 문제가 될 만한 지점을 발견할 수 있는가?
int main(void)
{
int *x;
int *y;
x = malloc(sizeof(int));
*x = 42;
*y = 13;
free(x);
}
main
함수 안의 첫 두 줄에서는 포인터 x
와 y
를 선언한다.
그 후 x
에는 malloc
함수를 이용해 int
자료형 크기에 해당하는 메모리를 할당한다.
그리고 x
가 가리키는 지점에 42를 저장하고 y
가 가리키는 지점에 13을 저장한다.
여기서 문제가 될 만한 부분은 *y = 13
이다. y
는 포인터로만 선언되었을 뿐이지 어디를 가리킬지에 대해서는 아직 정의되지 않았다.
따라서 초기화되지 않은 *y
는 프로그램 어딘가를 임의로 가리키고 있을 수도 있다.
이로 인해 그 곳에 13이라는 값을 저장하면 프로그램이 오류를 발생시킬 수 있다.
아래 코드와 같이 y = x;
라는 코드를 추가해주면 y
는 x
가 가리키는 곳과 동일한 곳을 가리키게 된다.
따라서 *y = 13;
으로 저장하면 x
가 가리키는 곳에도 동일하게 13으로 저장될 것이다.
int main(void)
{
int *x;
int *y;
x = malloc(sizeof(int));
if (x == NULL)
{
return 1;
}
*x = 42;
y = x;
*y = 13;
printf("x: %d\n", *x); // 13
printf("y: %d\n", *y); // 13
free(x); // x, y 둘 다 해제
return 0;
}
위 수정된 코드에서 y = x;
를 추가해 y
가 x
와 동일한 메모리 위치를 가리키도록 했다.
따라서 *y = 13;
로 저장하면 x
가 가리키는 곳에도 동일하게 13이 저장된다.
References
모두를 위한 컴퓨터 과학 (CS50 2019)
부스트코스 무료 강의
www.boostcourse.org
'CSE > CS50' 카테고리의 다른 글
[CS50] 자료구조 - 연결 리스트 (0) | 2024.06.18 |
---|---|
[CS50] 자료구조 - 배열의 크기 조정하기 (0) | 2024.06.18 |
[CS50] 메모리 - 파일 쓰기 (0) | 2024.06.17 |
[CS50] 메모리 - 메모리 교환, 스택, 힙 (0) | 2024.06.17 |
[CS50] 메모리 - 문자열 비교, 복사, 할당과 해제 (0) | 2024.06.17 |
경북대학교에서 컴퓨터과학을 전공하고 있는 학부생입니다. 컴퓨터 전공 관련 내용들과 프론트엔드 개발 지식들을 공유합니다. React, Javascript를 다룰 줄 알며 요즘에는 Typescript에도 관심이 생겨 공부하고 있습니다. 서로 소통하면서 프로젝트 하는 것을 즐기며 많은 대외활동으로 개발 능력과 소프트 스킬을 다듬어나가고 있습니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!