TIL 11월 6일 2023년

ORCASUIT·2023년 11월 6일

calloc

p->nil = (node_t *)calloc(1, sizeof(node_t));

컴퓨터 프로그래밍에서, 특히 C언어에서는 메모리를 직접 관리해야 할 때가 많습니다. 메모리를 관리한다는 것은 프로그램이 실행될 때 필요한 데이터를 저장할 공간을 컴퓨터의 메모리에서 "빌려오는" 것을 의미합니다. calloc은 이렇게 필요한 메모리를 빌려오는 함수 중 하나입니다.

calloc 함수는 빌려온 메모리 공간의 "주소"를 알려줍니다. 그런데 이 주소는 void*라는 특별한 형태로 알려주는데, void*는 "모든 종류의 데이터를 저장할 수 있는 메모리 주소"를 의미합니다. 마치 주소가 어떤 상점인데, 그 상점이 무엇을 파는지 아직 정해지지 않은 상태라고 생각할 수 있습니다.

하지만 우리가 원하는 것은 특정한 종류의 데이터, 예를 들어 node_t라는 이름의 특정한 형태의 데이터를 저장할 곳이기 때문에, 이 void* 주소를 node_t*라고 명확히 알려줘야 합니다. 즉, 그 상점이 node_t라는 상품만 파는 전문점임을 알려주는 것과 같습니다.

그래서 (node_t *)라고 적어주는 것입니다. 이것은 "이 주소에는 node_t 형태의 데이터가 들어있다"고 컴퓨터에게 알려주는 방법입니다. 그 결과로, 우리는 이 주소를 사용해서 node_t 데이터를 저장하고 읽을 수 있게 됩니다.


CLI로 gcc 컴파일러 명령어를 입력해서 수동으로 컴파일 하기.

  1. 컴파일 단계 : 각 C파일을 오브젝트 파일로 컴파일

    gcc -Wall -g -c driver.c -o driver.o
    gcc -Wall -g -c rbtree.c -o rbtree.o

  2. 링킹 단계 : 오브젝트 파일들을 링크하여 시행 파일을 생성

    gcc driver.o rbtree.o -o dirver

  3. 실행 단계 : 생성된 실행 파일을 실행

    ./driver

이 명령은 소스코드가 있는 동일한 디렉토리에서 실행되어야 하고, 각 단계별로 적절한 파일 경로를 제공해야함.


값 의한 전달 vs 참조에 의한 전달

void swap(int *arg1, int* arg2)
{
	int tmp;
	
	tmp = *arg1;
	*arg1 = *arg2;
	*arg2 = tmp;
}

포인터는 값에 의한 전달인가 참조에 의한 전달인가?

  • 매개변수로 배열을 전달할 때와 같이 의견이 분분
  • 원본이 바뀌니 -> 참조에 의한 전달?
  • 그런데 메모리 주소를 복사했는데 -> 값에 의한 전달?

엄밀히 말하면 C는

  • 함수를 호출할 때 언제나 변수를 복사함
  • 고로 '값에 의한 전달'
  • 단, 포인터를 사용해서 참조에 의한 전달을 흉내 낼뿐

여기서 중요한 것은

  • 원본이 바뀌는지 안바뀌는지가 제일 중요함

0개의 댓글