[C] Memory Leak
·
🏃‍♀️ Activities/42 Cursus
메모리 릭(Memory Leak)동적으로 할당한 메모리를 해제하지 않아서, 더 이상 접근할 수 없지만 프로그램이 종료될 때까지 메모리를 계속 차지하는 현상이다.malloc, calloc, realloc 등으로 힙 메모리를 할당해놓고, 나중에 free()로 해제하지 않으면 그 메모리는 프로그램이 끝날 때까지 계속 차지하고 남아 있게 된다.그런데 우리는 그 주소를 잃어버렸기 때문에 다시는 접근할 수 없다. 즉, 쓸 수도 없고 돌려줄 수도 없는 유령 메모리가 되는 것이다. 예시char *str = malloc(100); // 100바이트 메모리 할당// str에 접근 불가해지거나str = NULL; // 원래 할당된 100바이트는 더 이상 접근 불가// 혹은return; // 함수가 끝났는데도 free()를 ..
[get_next_line][C] read & write 함수
·
🏃‍♀️ Activities/42 Cursus
read()와 write() 함수는 unistd.h 헤더 파일에 정의되어 있다.표준입력(0), 표준출력(1), 표준에러(2)와 같은 파일 디스크립터를 사용해 다양한 입출력 작업을 수행할 수 있다. read() 함수read() 함수는 파일 디스크립터를 통해 데이터를 읽어오는 C 언어의 시스템 호출 함수이다.ssize_t read(int fd, void *buf, size_t count);fd: 읽을 대상의 파일 디스크립터buf: 데이터를 저장할 버퍼count: 읽을 바이트 수성공하면 읽은 바이트 수를 반환하고, 실패하면 -1을 반환한다. write() 함수write() 함수는 파일 디스크립터를 통해 데이터를 쓰는 C 언어의 시스템 호출 함수이다.ssize_t write(int fd, const void *..
[get_next_line][C] static 함수 & 변수
·
🏃‍♀️ Activities/42 Cursus
static 함수와 변수의 차이항목static 함수static 변수목적함수의 접근 제한 (파일 내부 전용)변수의 수명 유지 + 접근 제한수명컴파일 타임부터 프로그램 종료 시까지 존재 (변화 없음)컴파일 타임부터 종료 시까지 존재 (전역/지역 모두)사용 위치보통 .c 파일 안에 정의된 도우미 함수지역변수 or 전역변수외부 접근다른 파일에서 호출 불가다른 파일에서 참조 불가주로 사용되는 예count_digits, swap, itoa_helper 등호출 횟수 누적, 캐시 저장, 한 번만 초기화 변수 등 static 함수// ft_printf.c 내부static int count_digits(int n){ int len = 0; while (n) { n /= 10; le..
[get_next_line][C] open 함수
·
🏃‍♀️ Activities/42 Cursus
open() 함수파일을 여는 시스템 호출 함수이다.사용자가 파일에 접근(read, write 등)할 수 있도록 커널에게 요청하는 역할을 한다. 함수 원형#include int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode); // 파일 생성 시 권한 필요 반환값성공: 파일 디스크립터 (0 이상의 정수)실패: -1 (에러 발생)이 fd를 통해 read(), write(), close() 등에 전달해서 사용한다. 주요 flags 옵션들옵션설명O_RDONLY읽기 전용으로 열기O_WRONLY쓰기 전용으로 열기O_RDWR읽기 + 쓰기O_CREAT파일이 없으면 생성O_TRUNC열 때 기존 파일 내용..
[get_next_line][C] 파일 디스크립터(File Descriptor)
·
🏃‍♀️ Activities/42 Cursus
파일 디스크립터(File Descriptor)파일 디스크립터는 프로세스가 파일이나 자원에 접근할 때 사용하는 번호표다.유닉스나 리눅스 시스템에선 거의 모든 것을 '파일'로 본다.표준입력(0), 표준출력(1), 표준에러(2)가 기본으로 주어진다.프로세스가 새로운 파일을 열면, 커널이 가장 작은 사용 가능한 번호를 할당한다.이 번호를 이용해 프로세스는 파일이나 소켓, 파이프 등 다양한 자원에 접근할 수 있다. 1. 유닉스에서는 "모든 게 파일이다"단순한 파일뿐 아니라 디렉토리, 소켓, 파이프, 장치 등도 전부 파일처럼 다룬다.그래서 무언가와 통신하거나 읽고 쓸 때는 항상 "파일처럼 다루기" 위해 파일 디스크립터를 사용한다. 2. 파일 디스크립터는 정수값(번호)이다예: 0, 1, 2, 3, 4, ...0은 표..
[ft_printf][C] printf 포맷 출력 예시 (%p, %u, %x, %X)
·
🏃‍♀️ Activities/42 Cursus
%p – 포인터 출력int a = 42;printf("주소: %p", &a); // 예: 0x7ffee5bf88d8주소는 0x로 시작하는 16진수 형식으로 출력NULL 포인터는 0x0으로 출력 %u – 부호 없는 정수 출력unsigned int u = 3000000000;printf("부호 없는 정수: %u", u);%u는 음수 없이 양의 정수만 표현함음수를 넣으면 자동으로 unsigned 형으로 변환됨int x = -1;printf("%u\n", (unsigned int)x); // 4294967295printf("%u\n", -1); // 4294967295 %x – 16진수 출력 (소문자)unsigned int n = 48879;printf("16진수..
[ft_printf][C] 가변 인자 함수
·
🏃‍♀️ Activities/42 Cursus
가변 인자 함수 va_start, va_arg, va_copy, va_end가변 인자 함수는 인자 개수가 고정되어 있지 않고 필요한 만큼 넘길 수 있는 함수이다.대표적으로, printf함수가 있다.printf("합은 %d입니다\n", a + b);printf("%s %d %f\n", "숫자:", 3, 2.5);va_start(ap, param): 가변 인자 처리를 시작할 때 호출한다. ap는 va_list 타입 변수, param은 고정 인자 중 마지막 인자이다.va_arg(ap, type): 인자 하나를 가져올 때 사용한다. ap에서 하나 꺼내고, 그 다음 걸 가리키게 이동한다.va_copy(dest, src): va_list를 복사할 때 사용한다. 같은 인자 리스트를 두 번 읽어야 할 때 사용한다.va..
[Libft][C] 연결 리스트(linked list) 함수 구현 (lstadd_front, lstdelone, lstmap)
·
🏃‍♀️ Activities/42 Cursus
lstadd_frontvoid ft_lstadd_front(t_list **lst, t_list *new)lst: 리스트의 첫 노드를 가리키는 포인터의 주소 (헤드 포인터의 주소)new: 앞에 추가할 새로운 노드new->next = *lst;: 기존 첫 노드를 new->next에 연결한다.*lst = new;: new가 리스트의 첫 노드가 되도록 lst를 갱신한다.lst == NULL과 *lst == NULL의 차이lst == NULL: 리스트의 시작 주소가 없다. 즉, 리스트 자체가 존재하지 않는다는 뜻이다.*lst == NULL: 리스트는 존재하지만, 첫 노드(head)가 없다. 즉, 비어 있는 리스트라는 뜻이다. lstdelonevoid ft_lstdelone(t_list *lst, vo..
[Libft][C] memory 함수 구현 (memset / memmove / memchr / bzero / calloc)
·
🏃‍♀️ Activities/42 Cursus
memsetvoid *ft_memset(void *s, int c, size_t n)메모리의 내용(값)을 원하는 크기만큼 특정 값으로 세팅할 수 있는 함수이다. (memory + setting)s: 메모리의 시작 주소c: 채워 넣을 값 (1바이트짜리). unsigned char 로 변환되어서 저장된다.n: 채울 바이트 수 memmovevoid *ft_memcpy(void *dest, const void *src, size_t n)void *ft_memmove(void *dest, const void *src, size_t n)memmove는 memcpy처럼 메모리의 값을 복사하는 함수이다.memmove는 메모리가 겹치는 경우를 고려해서 안전하게 복사한다.dest == src: 복사 대상과..
[C] void & void *타입 / 포인터 연산
·
🏃‍♀️ Activities/42 Cursus
void & void * 타입void: 아무것도 반환하지 않음. (리턴값 없음)void *: 아무 타입이나 가리킬 수 있는 포인터 (리턴값 있음)포인터 연산포인터에 +1을 하면 그 포인터가 가리키는 자료형의 크기만큼 주소가 증가한다.int *p = (int *)0x1000;p = p + 1;int는 4바이트이므로 p + 1은 0x1000 + 4 = 0x1004가 된다.타입크기 (sizeof)p + 1 시 증가량char *1 byte+1 byteint *4 bytes (보통)+4 bytesdouble *8 bytes (보통)+8 bytesstruct X*구조체 크기+구조체 크기