[CS50] 자료구조 - malloc과 포인터 복습CSE/CS 기초2024. 6. 18. 12:00
Table of Contents
아래와 같은 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
728x90
반응형
'CSE > CS 기초' 카테고리의 다른 글
[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 |
@junyeokk :: 나무보다 숲을
컴퓨터 전공 관련, 프론트엔드 개발 지식들을 공유합니다. React, Javascript를 다룰 줄 알며 요즘에는 Typescript에도 관심이 생겨 공부하고 있습니다. 서로 소통하면서 프로젝트 하는 것을 즐기며 많은 대외활동으로 개발 능력과 소프트 스킬을 다듬어나가고 있습니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!