4. 함수
1) 함수와 동작 방식
▣ 함수란?
- 인자를 전달받아 작업을 수행하고 결과를 전달하는 구조
- 관리 및 수정의 용이성 증가
- 협업의 편리성 증가
- 코드 간결화
- 함수 내부의 지역변수는 함수 리턴과 함께 소멸
▣ 함수 동작 방식
- 호출부와 처리부는 상대적으로 결정됨.
- printf("%d", rand()); 라는 코드에서 rand()의 호출부는 printf()가 아닌 main()임.
☞ 메인에서 rand() 함수의 리턴값을 알아와서 printf()에게 인자로 전달이 가능함.
2) 함수 선언
▣ 함수의 선언
- 함수의 존재를 컴파일러에 알림 (함수의 형태 & 이름)
- 변수 선언과 다른점은 인자 부분임!
- 함수 선언에서 개수, 순서, 자료형이 중요함.
- 인자들은 해당 함수 내에서 지역변수와 같게 이용됨. 단지 초기값이 호출부에서 넘겨준 인자의 값으로 대입됨.
#include <stdio.h> int F1(); int F2(int nInput); void F3(); void F4(int nInput, char ch); int main() { F1(); return 0; }
☞ 컴파일은 돌아가나 빌드에서 오류가 남.
- 함수는 같은 프로젝트 내의 다른 .c 에서도 사용가능하기 때문에 컴파일러가 컴파일 할 때 다른 소스에
해당 함수의 정의가 있을 수도 있겠구나라고 생각해서 문법만 체크하고 오류를 발생시키지 않음.
- But! 선언을 한 소스파일 내에서만 해당 함수를 이용가능함.
#include <stdio.h> int main() { F1(); return 0; } int F1(); int F2(int nInput); void F3(); void F4(int nInput, char ch);
☞ 컴파일도 안됨!!
- 컴파일러는 무조건 소스코드의 제일 위에서부터 아래로 읽어오는데 main에서 F1()을 읽을 땐 정의되어 있지 않기 때문.
3) 함수 정의
▣ 함수의 정의
- 함수의 실제 동작을 설명
- 함수의 실체를 만드는 것
▣ 정의 및 선언
#include <stdio.h> void F1() { printf("F1 함수 호출\n"); } int main() { F1(); return 0; }
- 정의 및 선언을 한번에 함.
▣ 프로토 타입
#include <stdio.h> void F1(); int main() { F1(); return 0; } void F1() { printf("F1 함수 호출\n"); }
- 함수의 선언을 코드 제일 상단에 선언은 밑에 하는 타입.
- 위의 방법이 가장 권장 형태임.
▣ 스택 프레임
- 다른 함수로 보내지는 인자들은 그 함수의 호출부의 스택프레임 바로 위에 자리잡음.
- 함수 인자가 여러개일 경우 뒤의 것부터 더 큰 주소에 넣음.
- 함수의 return 값은 스택에 저장되는 게 아닌 CPU에 따로 저장장소가 마련되어 있음.
- 위의 중요정보 부분을 내가 의도한 값으로 잘 채워넣으면 호출부 함수로 돌아가는게 아닌 다른 의도로의 행위를 취할 수 있음 (BOF)
Q. 문자열은 데이터 영역이라며, 근데 입력받는데 스택이 왜 터짐?
A. 문자열 상수만 데이터 영역임. 사용자 인풋을 받기 위해 마련하는 char 형태의 배열들은 내가 직접 선언한 변수이므로 스택영역임.
i2sec 대구지점 23기 수료생.
'해킹&보안 > C언어' 카테고리의 다른 글
[D+19] 포인터 (1) (0) | 2017.03.07 |
---|---|
[D+18] 파일 입출력 심화(스테가노그래피) (2) | 2017.03.06 |
[D+16] 파일 입출력 (2) (0) | 2017.03.01 |
[D+15] 파일 입출력 (1) (0) | 2017.02.27 |
[D+14] C언어 기초 (7) (0) | 2017.02.26 |