1.BUFFER_SIZE는 내가 가지고 있는 양푼의 크기. 한줄에 얼마나 많은 글자가 들어가있을지 알 수 없기 때문에 동적할당으로 해결해야한다고 생각했다.
2.Static value를 전역변수처럼 사용하고 있음.
구현방법 1.(sujung, kylee)
buffer는 지역변수로 두고, get_next_line함수에서 개행이전까지는 return하고, 개행이후에 string은 동적할당으로 저장해둔다.
-> 일회용 주사기로(buffer)에 피를 빨고, 100ml 정량은 내보내고(*line = ft_strdup(sub_buffer)), 나머지양은 임시 저장해둔다(함수에서 계속 쓰기 때문에 static으로 두어야함)
구현방법 2.✅
buffer를 정적변수로 두고, buffer에 개행문자가 들어갈 경우, 그 만큼을 읽고 return한다. buffer에서 개행 이후의 string을 strlcpy하여 buffer의 index를 옮긴 형태로 buffer에 새로 복사한다.
-> 국 퍼내는 국자(static buffer)로 손님께는 깨끗한 접시에 담아서(*line = ft_strdup(sub_buffer)) 내보내는 느낌
근데 내 코드에서 문제는 국퍼내는 국자를 한번 쓸 때마다 씻어줘야함...(ft_memset)
1.개행을 읽기전까지는 계속 while ((validation = read(fd, buffer, BUFFER_SIZE)) > 0)
로 읽기로 한다.
2.gcc -D defines a macro to be used by the preprocessor.
https://www.rapidtables.com/code/linux/gcc/gcc-d.html
3.4 -> tetest_free()_AND_static.c in github(github.com/exgs/42cursus/tree/master/02.get_next_line#get_next_line)
3.정적변수는 정적변수가 정의된 함수에 내장되어있다.
정적변수가 정의된 함수를 f1
f1을 호출하고 있는 함수를 f2, f3라고 하자
f2를 호출하여 f1의 정적변수의 변화가 있다면, f3을 호출하여 f1가 호출될 때, 정적변수의 변화가 반영되어있다.
즉 정적변수는 포함관계가 적용되기보다는 f1함수 내에 계속 저장되어있는 성질과 같은 것 이다.
4. 잘못된 free사용
(window에서 gcc로 컴파일후에 실행시키면, 문제없이 실행되기도한다. mac os에서 gcc로 컴파일한 실행파일을 실행시키면, error)
free twice, free stack memory, free read-only-part
Example: github.com/agavrel/42_CheatSheet#0x06--freeing-memory-that-has-already-been-fred
5. read, open의 return이 -1이 되는 상황
- 파일을 읽지 못했을 때
- file descriper로 음수가 들어갈 때, open으로 return 된 fd가 아닌 임의의 정수fd을 read함수에 넣어줄 때
- read의 buffersize < 0 일 때, (buffersize = 0 이면, 0)
'42cursus > get-next-line' 카테고리의 다른 글
개행으로 끝나느냐, 개행으로 끝나지 않느냐 (0) | 2020.07.22 |
---|---|
get_next_line(bonus) (0) | 2020.07.11 |
프로세스의 메모리, 파일 입출력함수 (0) | 2020.07.01 |