CS50 - 6.자료구조 (ing)

KIMMY·2020년 7월 20일

CS50

목록 보기
8/8

1. malloc과 포인터 복습

int main(void)
{
    int *x;  // 정수를 가르키는 포인터 변수 x를 생성
    int *y;
 
 // 4바이트의 공간을 요청 
 // 메모리덩어리를 할당
 // 메모리 영역의 첫 주소를 반환
 
    x = malloc(sizeof(int)); 
   
 //*은 역참조 연산자, x에 저장된 주소로 가서 42를 저장
    *x = 42;
    
    // 아래 코드는 버그임
    // y = x; 를 선언 후 가능
    *y = 13;
}

포인터를 초기화시키지 않고 값을 저장하면 어떤 오류가 발생할 수 있을까요?

A. 위의 코드를 보면 y는 포인터로 선언 되었지만, 값을 초기화하지 않았다. 초기화되지 않은 *y는 프로그램 어딘가를 임의로 가리키고 있을 수도 있다. 그곳에 13이라는 값을 넣으면, 오류가 생길 수 있다.

2. 배열의 크기 조정하기

메모리는 마치 사물함과 같다. 사용할 사물함의 개수를 정한 이후에는, 공간이 모자라도 주변 사물함을 마음대로 사용할 수 없다. malloc을 이용해서 이미 정의된 배열의 크기를 바꿀 수 있다.

  • malloc
    malloc을 이용하면, 새로운 변수(더큰 사이즈의 배열)을 만들어서 for 을 통해 기존 배열에서 새로운 배열로 이동시킨다.
  • realloc
    위의 과정을 realloc을 이용해서도 가능하다.
    realloc을 사용하면 기존 값을 가져온다. 따라서 추가될 값만 추가하면 됨.

이미 할당된 메모리의 크기를 조절할 때 임시 메모리를 새로 할당해줘야 하는 이유는 무엇인가요?

기존 메모리 주변 메모리는 이미 사용중일 수 있음으로,
안전하게 여유로운 공간에 새로 메모리를 만들고 옮기는 것.

3. 연결 리스트: 도입

  • 데이터 구조는 우리가 컴퓨터 메모리를 더 효율적으로 관리하기 위해 새로 정의하는 구조체.
    일종의 메모리 레이아웃, 또는 지도.
  • 배열
    배열은 메모리에서 연속적으로 자리한다.
  • 연결 리스트
    연결리스트는 각각 값에 다음 값을 가르키는 정보를 갖는다.
    (자신의 값 + 다음 값의 포인터(주소))
    마지막 값은 다음포인터로 null을 갖는다.

연결리스트는 배열의 복사(temp)사용없이 추가할 수 있다.
그러나 index를 사용할 수 없다.
index는 메모리에서 연속적으로 자리할 때만 가능

profile
SO HUMAN

0개의 댓글