카테고리 없음

20230727_TIL 함수포인터

웹개발자지망생 2023. 7. 27. 14:47
  •  함수 포인터의 선언

 

  •  함수 포인터의 선언 방법은 다음과 같다.
자료형 (* 함수 포인터 이름)(인자 목록)
  • 함수명 앞에 *만 붙여주면 함수 포인터가 선언된다.
int(*func)(int a);

 


함수 포인터 사용이유

  •  직접 함수 호출되면 되지 왜 복잡하게 함수 포인터를 사용하나?
  •  컴파일 타임 또는 런타임에 메모리 크기 및 위치가 결정된다.
  •  이를 각각 정적 바인딩, 동적바인딩이라고 한다.
  •  이클립스와 같은 플러그인 사용을 예를 들어보면 이클립스 실행시 플러그인은 매번 수행된다.
  •  플러그인에 새로운 함수가 추가될때마다 매번 다시 컴파일해야 하는 비효율적인 상황이 발생된다.
  •  함수 포인터의 사용은 프로글매은 확장성과 유용성을 위함이다.

메모리의 구조

메모리 영역

메모리는 크게 코드영역, 스택영역, 힙영역, 데이터영역 총 4가지로 구분

 

코드영역 -> 실행 명령어들 저장

스택영역 -> 지역변수 및 매개변수 저장

힙 영역 -> 프로그래머가 직접 할당

데이터 영역 -> 전역변수 static 변수 저장

 


메모리 영역

 - 코드(code)영역

소스코드가 저장되는 영역으로, 실행할 명령어들의 순서대로 쌓인다.

- CPU가 이영역에서 명령어들을 하나씩 가져다가 처리한다.

 

동적 메모리 할당

  • 동적으로 메모리를 할당하는 이유
  •  결국 학생수는 유동적이므로 고정하지 말고 실행시 결정하자.
int num;
fputs("학생수를 입력하세요 : ", stdout);
scanf("%d",&num);
int student[num];

 

문제점

- scanf 런타임(run-time)에 실행

- int student[num] 은 컴파일타임(complie-time)에 실행

- 런타임에 입력 받은 변수를 컴파일 타임에 대입하는 형태는 논리에 맞지 않는다. 

 

해결방법

- 실행 중에 학생수를 알아야하는 경우, 동적 메모리를 할당 기법을 통해 문제 해결이 가능하다.


메모리 할당 및 해제

  • 동적 메모리 할당 함수의 원형
void* malloc(size_t size);

- 엠얼록 또는 말록이라고 읽는다.

- 전달인자 size는 바이트 단위로 입력

- 메모리 할당이 되면 메모리의 주소값을 리턴

- 메모리 부족시 NULL 포인터 리턴

- 리턴형이 void* 인데, 타입이 지정되어 있지 않는 포인터를 리턴( 난 당신이 원하는 메모리 크기 만큼 할당해줄테니, 메모리는 당신이 원하는 형태로 정해서 사용하세요.)

 

  • 동적 메모리 해제 함수의 원형
void free(void* memblock);

- 메모리 사용후 반드시 해제해주어야 한다.

- 전달인자로 메모리를 가리키는 포인터를 대입한다.

- void free 함수 할당하지 않으면 재사용 불가가 된다. 컴퓨터 에러 상태가 된다.(메모리 누수)

 

조건부 컴파일

  • 조건에 따라 컴파일을 할 것인지 말것인지 결정하는 것
  • 소스코드 내에서 특정 여영ㄱ을 지정하여 컴파일 유무를 결정
  • 이기종 간의 두 개의 플랫폼 상에서 같은 소스를 동작시킬 경우