gnl을 끝냈는데 static이 뭔지도 모른다면... 치팅입니다...
그 정도로 정적변수는 gnl에서 중요합니다. 그렇기에 확실하게 짚고 넘어갑시다!
ex)
static int a;
int main(void)
{
static int num;
printf("%d", num);
}
0
void my_static(void)
{
static int num;
num += 1;
printf("%d\n", num);
}
int main(void)
{
my_static();
my_static();
}
1
2
이렇게 동적 할당처럼 함수가 끝나더라도 그 값이 남아있고 그 함수에 다시 들어가면 이전에 있던 값이 그대로 남아있습니다.
gnl.txt
라는 파일을 읽을거고 그 파일의 내용은 이렇습니다.get_next_line
123456789
main은 이렇게 사용해서 한 줄씩 읽어들이고, BUFFER_SIZE는 5로 정해놓고 진행하도록 합시다.
int main(void)
{
char *line;
int fd;
int ret;
fd = open("gnl.txt", O_RDONLY);
while ((ret = get_next_line(fd, &line)) > 0)
{
printf("line = %s\n", line);
free(line);
}
free(line);
}
gnl내부에서 사용되는 변수 buf와 static_buf은 이렇게 선언됐다고 생각해 두고 넘어갑시다.
char *buf[BUFFER_SIZE];
static char *static_buf;
그럼 이제 gnl이 어떻게 동작하는지 간단하게 알아보도록 합시다.
우선 read함수로 BUFFER_SIZE만큼 파일을 읽을겁니다.
그러면 'gnl.txt'의 파일안에 5개의 문자 "get_n"까지만 가지고 와서 buf에 넣어둘 것입니다.
그런 다음에 buf에서 static_buf로 "get_n"을 옮깁니다.
그리고 static_buf에 있는 문자열에 개행이 있는지 확인하는데 없으니 BUFFER_SIZE만큼 한번 더 읽어들이고 static_buf에 이어붙입니다.
개행이 없으니 한번 더 반복합니다.
개행을 찾았습니다! 그러면 개행 전까지의 문자를 매개변수로 들어온 line에 할당한 후 static_buf에는 개행 이후의 문자만 남겨놓습니다.
이런 식으로 우리는 한 줄을 읽어들였고 gnl은 이런 식으로 동작하게 됩니다.
gnl함수가 끝나기 전 까지는 일반적인 할당이나 별 차이 없지만 gnl함수가 끝난다면 우린 저장해놓은 "1"이라는 문자열을 찾을 수 없게 됩니다.
무슨 말이냐면 char_buf는 지역변수입니다. 함수가 끝나면 사라지죠.
즉 "1"을 가리키고있던 char_buf가 사라졌으니 우린 "1"을 찾을 수 없게되어 메모리 누수가 나게 됩니다.
gnl을 다시 불러들여서 사용해도 이전에 사용했던 char_buf와 그 다음 char_buf는 전혀 다른 변수가 되어버린 것이죠.
이런 내용때문에 우린 static을 사용할 수 밖에 없습니다.
static은 함수가 끝나도 사라지지 않습니다.
이 말은 함수가 끝날 당시의 static_buf="1"이 한번 더 gnl을 사용해서 들어갔을때도 그대로 static_buf="1"이라는 뜻입니다.
이렇기 때문에 정적변수를 사용해야되는 것이죠.
[get_next_line] get_next_line에 대해 알아보자.
[get_next_line] 파일디스크립터에 대해 알아보자
[get_next_line] 정적변수, static variable에 대해 알아보자
[get_next_line] get_next_line! 어떤 식으로 구현해야할까?