[42서울] Libft

jabae·2022년 3월 29일
0

42Seoul

목록 보기
2/20

🤓 Study

Part 1. Libc functions

  • string 관련 함수에서는 마지막에 '\0' 꼭 넣어준다.
  • unsigned char 는 부호비트가 없기 때문에 모든 bit를 투명하게 볼 수 있다.
    → 따라서, 임의의 메모리에 바이트 단위로 접근해 값을 다룰 때, 반드시 unsigned char를 사용한다.
  • 문자열이나 메모리의 사이즈를 구할 때에는 unsigned int 대신 size_t 를 사용한다.
  • const 로 선언된 변수는 값을 변경할 수 없고 변경시 컴파일 에러가 뜬다.
  • *restrict 는 특정 메모리 영역에 접근 할 수 있는 포인터가 단 하나임을 보장하는 키워드이다.
    → 프로그래머가 컴파일러에게 이 포인터 외엔 그 메모리 영역에 접근하는 수단이 없다고 미리 알려주는 역할을 해서 컴파일러가 더 나은 최적화를 하도록 도와준다.
  • 기본적으로 c언어는 자료형이 다른 포인터끼리 메모리 주소를 저장하면 컴파일 경고(warning)가 발생한다. 하지만 void 포인터 는 자료형이 정해지지 않은 특성 때문에 어떤 자료형으로 된 포인터든 모두 저장할 수 있다.

Part 2. Additional functions

  • 하위함수는 static 으로 선언한다.
    → c언어에서 static 으로 선언한 함수는 해당 소스파일에서만 사용이 가능하므로 다른 파일의 함수이름과 겹칠 일을 방지한다.
  • 동적메모리 사용 후 free를 해준 다음, 포인터에 NULL을 할당한다.
    → 댕글링 포인터 방지!! 댕글링 포인터는 해제된 메모리 영역을 가리키는 포인터이다. 메모리 접근 시 예측불가능한 동작, 메모리 접근 불가 시 세그폴트, 잠재적 보안 위험 등등 위험이 있다.

Part 3. 연결리스트 구조체

typedef struct s_list
{
    void          *content;
    struct s_list *next;
}              t_list;

content : 요소에 포함된 데이터. void * 를 통해 어떠한 자료형의 값도 담을 수 있다.
next : 다음 요소의 주소값. 만약 해당 요소가 마지막 요소라면, NULL을 가리킨다.
t_list : 구조체 별칭.

  • !lst : 리스트 자체가 존재하지 않음을 의미한다.
  • !(*lst) : lst의 첫번째 주소를 의미 리스트 내에 노드가 존재하지 않다는 뜻이다.
  • 이중 포인터를 사용하는 이유는 단일 포인터를 사용하게 되면 실제 main 함수에서 만들어진 리스트의 주소값을 참조할 수 없으므로 이중 포인터를 사용하여 실제 리스트 포인터가 저장된 주소값을 넘겨준다.
  • 아카이브를 만들 때 하나의 일관성을 가지고 코드를 만들어야 한다. 리스트가 비었을 때 가드를 해줄꺼라면, 함수가 비었을 때에도 똑같이 터지지 않도록 가드를 해주어야 한다.
profile
it's me!:)

0개의 댓글