카테고리 없음
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 함수 할당하지 않으면 재사용 불가가 된다. 컴퓨터 에러 상태가 된다.(메모리 누수)
조건부 컴파일
- 조건에 따라 컴파일을 할 것인지 말것인지 결정하는 것
- 소스코드 내에서 특정 여영ㄱ을 지정하여 컴파일 유무를 결정
- 이기종 간의 두 개의 플랫폼 상에서 같은 소스를 동작시킬 경우