[42서울] Libft
🤓 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 함수에서 만들어진 리스트의 주소값을 참조할 수 없으므로 이중 포인터를 사용하여 실제 리스트 포인터가 저장된 주소값을 넘겨준다.
- 아카이브를 만들 때 하나의 일관성을 가지고 코드를 만들어야 한다. 리스트가 비었을 때 가드를 해줄꺼라면, 함수가 비었을 때에도 똑같이 터지지 않도록 가드를 해주어야 한다.
Author And Source
이 문제에 관하여([42서울] Libft), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@pearpearb/42서울-Libft저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)