본문 바로가기
42cursus/get-next-line

get_next_line(mandatory)

by 인듯아닌듯 2020. 7. 2.

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)