[자료구조] malloc과 포인터 복습
![[자료구조] malloc과 포인터 복습](https://cdn.hashnode.com/res/hashnode/image/upload/v1717335452330/0bf801d9-b6af-4b64-b0b9-f15f1f22d4ba.png)
데이터 구조를 정의하고 관리하는데 있어서 메모리와 포인터에 대한 개념을 정확히 이해하는 것이 중요하다.
이전에 배운 malloc 함수와 포인터를 복습해보자.
다음의 코드에서 문제가 될 만한 지점을 찾아보자.
int main(void)
{
int *x;
int *y;
x = malloc(sizeof(int));
*x = 42;
*y = 13;
}
main함수 안의 첫 두 줄에서는 포인터 x와 y를 선언한다.- 그리고
x에는malloc함수를 이용해int자료형 크기에 해당하는 메모리를 할당한다. - 그 다음에는
x와y포인터가 가리키는 지점에 각각 42와 13을 저장한다.
여기에서 문제가 될 만한 부분은 *y = 13이다. y는 포인터로만 선언되었을 뿐이지, 어디를 가리킬지에 대해서는 아직 정의가 되지 않았기 때문이다.
따라서 초기화 되지 않은 *y는 프로그램 어딘가를 임의로 가리키고 있을 수도 있기 때문에 그 곳에 13이라는 값을 저장하는 것이 오류를 발생시킬 수도 있는 것이다.
다음과 같이 y = x;라는 코드를 더해주면, y는 x가 가리키는 곳과 동일한 곳을 가리키게 된다.
y = x;
*y = 13;
따라서 *y = 13;으로 저장하면 x가 가리키는 곳에도 동일하게 13으로 저장될 것이다.
생각해보기
포인터를 초기화시키지 않고 값을 저장하면 어떤 오류가 발생할 수 있을까?
정답
- 세그멘테이션 오류(Segmentation Fault): 초기화되지 않은 포인터가 잘못된 메모리 위치를 가리킬 경우 발생한다.
- 잘못된 메모리 접근: 프로그램의 다른 메모리 영역을 덮어쓸 수 있다.
- 디버깅 어려움: 오류 원인을 찾기 어렵다.
- 보안 문제: 공격자가 임의의 메모리에 접근할 수 있는 취약점이 생길 수 있다.

