get_next_line(1) - 파일 디스크립터, 정적변수, 댕글링포인터 등 사전지식

yeham·2022년 12월 4일
1

42Seoul

목록 보기
3/18
post-thumbnail

파일 디스크립터 (fd)

  • 운영체제가 파일 또는 하드웨어와 통신을 하기 위해 부여하는 숫자

  • 파일 디스크립터 0, 1, 2 숫자순으로 부여됩니다.
    0, 1, 2는 파일 디스크립터 테이블에 미리 저장되어 기본적으로 사용중이기에 3부터 파일 디스크립터를 부여합니다.

    0 : 표준입력 STDIN / 1 : 표준출력 STDOUT / 2 : 표준에러 STDERR
  • open() 함수는 파일을 열고 파일 디스크립터 값을 반환 (실패시 -1 리턴) 그 값을 이용하여 이후에도 계속해서 열었던 파일에 접근 가능합니다.

  • 리눅스의 모든것은 파일로 이루어져 있습니다.
    즉 리눅스 기반 운영체제는 fd로 리눅스의 모든 파일들을 관리하고 따라서 프로그램을 실행시키기 위해서는 가장 먼저 파일을 열어야 합니다.

static 변수 (정적변수)

static 변수Global 변수 (전역 변수), Local 변수 (지역 변수) 어느 것으로 이용이 가능합니다.
전역이든 지역이든 static 변수데이터 영역에 위치합니다다.

  1. 변수를 선언할 때 static키워드를 붙여 선언한다. static int num

  2. 일반 지역 변수가 할당되는 stack 스택 영역이 아니라 data 데이터 영역에 저장되어 프로그램이 종료될 때까지 남아있는 변수

  3. 함수를 벗어나도 해당 변수는 사라지지 않고 계속 유지를 하지만
    함수 내부에서 선언되었다면 다른 함수에서는 이 값을 참조할 수 없다.
    또한 함수의 시작이 아닌 프로그램의 시작 시 할당이 되며, 프로그램이 종료될 때 해제된다.

  4. 구조체를 static으로 선언한 경우 그 안의 멤버변수들이 0으로 초기화된다. (지역 변수는 초기화하지 않으면 쓰레기값으로 초기화된다.)

  5. 정적 변수는 초기값을 지정하지 않으면0으로 알아서 초기화된다.

  6. get_next_line에서는 다음 line을 읽을 시작 주소를 계속 저장할 수 있도록 백업 버퍼를 만들어 static 변수로 선언해야 한다.

=> 외부 정적변수

전역으로 선언된 static 변수외부 정적 변수라고도 불리며, 별도의 초기화 구문이 없어도 0으로 초기화됩니다.

BSS 영역에 위치하여 0으로 초기화된다. 초기화 구문 존재 시에는 Data 영역에 위치합니다.
BBS는 block started bu symbol의 약어로 초기화 되지 않은 전역 데이터를 위한 영역입니다.

=> 내부 정적변수

특정 함수나 클래스 내부에 선언된 지역 변수내부 정적 변수라고도 불리며, 외부 정적 변수와 마찬가지로 별도의 초기화 구문이 없어도 0으로 초기화 된다. 또한 내부 정적 변수의 경우에도 프로세스의 메모리가 할당되는 프로그램의 시작 시점에 이뤄지기 때문에 함수 실행 등으로 인한 선언문에서의 실행으로는 초기화가 이뤄지지 않고 무시된다.

초기화 시점이 프로그램의 시작이라서 함수 실행 시 초기화 구문에서 초기화가 안 된다고 했는데, 이렇게 되어도 문제가 없는 이유는 static 변수는 함수 혹은 클래스에 대해서 내부 정적 변수로 이용되는 경우에 각 함수 별 혹은 클래스 별로 공유되는 일종의 공유 변수로 이용되기 때문이다.

#include <stdio.h>

void	increase_num(void)
{
	static int	num = 4;

	printf("%d\n", num);
	num++;
}

int		main(void)
{
	increase_num();
	increase_num();
	increase_num();
	return (0);
}

위의 경우 static int num이라는 내부 정적 변수의 초기화는 프로그램의 시작에 이뤄지며 초기 값은 4가 됩니다.
이 때 static int numincrease_num이라는 함수의 지역 변수처럼 보여 Stack에 위치할 것 같지만, 실제로는 (이 경우에는 초기화 구문이 존재하므로 BSS 영역이 아닌) Data 영역에 위치하고 있습니다.
위에서 언급했던 초기화 구문이 동작하지 않는다는 얘기는 increase_num 함수 내의 초기화 구문인 static int num = 4가 매 함수 실행마다 이뤄지지 않습니다.
또한 내부 정적 변수는 특정 함수 혹은 클래스 간 공유되어 사용된다고 했기 때문에 위 함수의 실행 결과는 4, 5, 6이 출력됩니다.

댕글링 포인터 (Dangling Pointer)

포인터가 여전히 해제된 메모리 영역을 가리키고 있다면,
이러한 포인터를 ‘댕글링 포인터(Dangling Pointer)’라고 합니다.
댕글링 포인터가 가리키는 메모리는 더는 유효하지 않아 허상포인터 라고도 불립니다.
이미 해제된 메모리를 가르키는 포인터 입니다.

profile
정통과 / 정처기 & 정통기 / 42seoul 7기 Cardet / 임베디드 SW 개발자

0개의 댓글