본문으로 바로가기

[D+17] 함수

category 해킹&보안/C언어 2017. 3. 2. 23:27
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

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