Test/C

함수 응용1 : 매개변수 전달방법, 스택 프레임 그리는 방법

kiostory 2018. 12. 26. 20:46

* 매개변수 전달 방법

- Call by value

- Call by reference                       ---> 포인터

* 스택 프레임 그리는 방법                     ---> 중요

-------------------------------------------------- 함수 응용1

* 재귀호출

- 재귀호출을 이용한 문자열 출력

- 재귀호출의 장/단점

* 문자/문자열 처리 함수

- 문자 처리 함수

- 문자열 처리 함수

- 유니코드 문자열

* 유틸리티 함수

- atoi, atol, atof

- time, localtime, ctime

- srand, rand

- system, exit

-------------------------------------------------- 함수 응용2



----------------------------------------------------------------------------------------------------------------

* 매개변수 전달 방법

----------------------------------------------------------------------------------------------------------------

main() 내의 함수

- main() : caller

- 내의 함수 : callee

- caller는 callee를 호출할때 '실인수'를 정의

- caller에게 반환하는 값은 또한 임시 결과이다


binding : caller와 callee로 묶임






----------------------------------------------------------------------------------------------------------------

call by reference

----------------------------------------------------------------------------------------------------------------

ex)

#include <stdio.h>

#include <stdlib.h>

#include <string.h>


void TestFunc(int *pnParam)

{

*pnParam =10;

}


int main(void)


{

int nData=0;

TestFunc(&nData);

printf("%d\n",nData);

return 0;

}

-----------------------------

10

-----------------------------


ex)

#include <stdio.h>

#include <stdlib.h>

#include <string.h>


// 주소를 반환하는 사용자 정의 함수 선언

char* GetName(void)

{

char *pszName=NULL;

//메모리 동적 할당

pszName=(char*)calloc(32,sizeof(char));

printf("이름을 입력하세요 : ");

//동적 할당한 메모리에 사용자 입력 문자열 저장

gets_s(pszName, sizeof(char)*32);

return pszName;

}




int main(void)


{

char *pszName=NULL;

//이름이 저장된 동적 할당 메모리의 주소 반환

pszName=GetName();

printf("당신의 이름은 %s 입니다.\n", pszName);

//호출자 함수가메모리를 해제

free(pszName);

return 0;

}

-----------------------------

이름을 입력하세요 : 탐 크루즈

당신의 이름은 탐 크루즈 입니다.

-----------------------------


ex) Swap

#include <stdio.h>

#include <stdlib.h>

#include <string.h>


void Swap(int *pLeft, int *pRight)

{

int nTmp = *pLeft;

*pLeft = *pRight;

*pRight = nTmp;

}


int main(void)

{

int a = 10, b = 20;

Swap(&a, &b);


printf("%d, %d\n", a,b);

   

return 0;


}

-----------------------------

20, 10

-----------------------------



----------------------------------------------------------------------------------------------------------------

잘못된 주소 전달

----------------------------------------------------------------------------------------------------------------

ex) 사라질 메모리의 주소를 반환하는 것

#include <stdio.h>

#include <stdlib.h>

#include <string.h>


int* TestFunc(void)

{

int nData = 10;         // 지역/자동 변수 nData의 주소를 반환. 값이 나와도 잘못된 로직임!!

return &nData;

}


int main(void)

{

printf("%d\n", *TestFunc());

   

return 0;


}


----------------------------------------------------------------------------------------------------------------

스택 프레임 그리는 방법

----------------------------------------------------------------------------------------------------------------

- 함수 내부에 선언된 변수와 매개변수는 기본적으로 '스택'을 사용

- 스택과 메모리의 주소는 반대 방향으로 그린다


- 스택 메모리 공간

> 변수 선언시마다 쌓이는 구조

> cf. 스택에 넣기 : push, 스택에서 빼 읽기 : pop

> int a,b;


..

..

..

b

a


> a를 먼저 스택에 push 했다