Eat Study Love

먹고 공부하고 사랑하라

SW 만학도/C

4. Function ic C - Grammer

eatplaylove 2024. 3. 25. 23:47

https://eglife.tistory.com/40

 

3. Control Structures in C - Condition ( While / For Loop )

https://eglife.tistory.com/33 2-1. Operators / Memory in C https://eglife.tistory.com/32 2. Variables in C 아무리 봐도 불친절한 C.. 파이썬을 배우다가 와서 그런가 불편한 게 이만 저만이 아니다. 그래도 파이썬코드보

eglife.tistory.com

 

 

If / Else / While 같은 건 C나 Python이나 비슷하다.

 

다만, Indentation / 중괄호로 구문을 구분하는 것들이 좀 차이가 있다.

 

Python과 C에서 Function / Memory 부분이 어떻게 달리 동작하는지 Check를 해보자!

 

 

Function in C - Grammer

 

 

- ex) Factorial을 계산해주는 함수를 만들어보자

#include <stdio.h>

int fact(int n);


int main(void)
{
    int num;
    int ans;
    printf("Input a number:");
    scanf("\n%d",&num);

    ans = fact(num);
    printf("factorial of %d is: %d\n",num,ans);

    return 0;
}

int fact(int n)
{
    int result = 1;
    for(int i=1; i<=n; i++)
    {
        result = result * i;
    }
    return result;
}

 

 

int Factorial(int n); --> 함수 축약본이라도 미리 선언되어야 함(Header 정보), 자세한 함수내용은 뒤에 있어도 됨!!! 왜냐하면 C Compiler는 모든 내용을 한번에 번역하고 실행하니까 가능한 것이다

 

 

 

- Python 대비.. C에서 함수의 Definition

 

  1. Header에 output의 data type, Function name, Function의 Parameter 3가지가 선언되어 있어야 한다. 필수사항임!

 

  2. 함수 내용을 Indentation이 아닌 중괄호로 구분

 

  3. 함수 안에서 선언되는 Variable은 중괄호 안에서 생성되었다가 그 안에서 죽는다. #Local Variable! Local Scope!

 

  4. 함수 Call expression은 파이썬 때와 비슷. BUT 함수 Input type에 맞춰서 Variable을 넣어야 한다.

 

  5. 함수가 Call 되기 전에 선언되어 있어야 한다.

 

- 함수의 Return 값이 없으면 void function(int n) : ~~~ 이런식으로 void 활용, input이 없으면 int main(void) ~~

 

 

Memory Operation in C

 

#include <stdio.h>

int Watt(int n);
int Volt(int a,int b);


int main(void)
{
    int a;
    int b;
    b = Watt(a);    //call Watt
    b= Volt(a,b);   // call Volt
    printf("%d,%d",a,b);
    return 0;
}

int Volt(int q, int r)  //무의미
{
    int k;
    int m;
    return 3;
}

int Watt(int a) //무의미
{
    int w;
    w = Volt(w,10);
    return w;
}

 

 

- 대충 위와 같이 아무런 의미 없는 코드가 있다고 가정해보자, 함수가 Call 될 때마다 Memory가 어떻게 변하는 지 확인

 

 

  1) Main 함수에서 int a / int b 가 생겼다

 

 

 

 

  2) Main에서 Watt함수를 Call 한다.

 

 

 

  3) Watt안에 있는 Volt가 또 실행된다.

 

 

 - Watt 위에 Stack 구조 Push로 Volt Memory 생성! q,r,k,m 등등 필요한 변수들이 R5에서 시작해서 R6까지 쭉 저장

 

 - Main / Watt에 대한 Call이 아직 끝난게 아니라 각각의 메모리는 살아있음

 

 

  4) Volt 함수가 다 돌았다.

 

 

- 가장 나중에 들어왔던 메모리 Volt Function이 POP! 가장 먼저 끝났다. LIFO --> STACK 구조

 

 

5) Main함수 내에 Watt 함수도 끝났다.

 

 

 

  6) Main 함수에서 다음 Volt 함수를 Call!

 

- Volt Memory 공간 Pushed

 

 

 

  7) Volt 함수 끝나면 다시 Volt Memory POP 되고 Main 함수 끝나면 Main Memory도 POP 되어서 끝!

 

- Compile 할 때 말고, 함수가 실행(RUN) 되면서 메모리가 늘었다 줄었다 한다 -> Run Time 구조 메모리다.

 

 

Memory Operation Details

 

1) Calling ( Passing arguments to the function)

 

- Watt 함수 내에서 Volt 함수가 Call 되었을 때를 살펴보자

 

 

 

- R6 값이 하나씩 줄면서(커서가 위쪽으로 이동하면서) 그 곳에 Volt 계산을 위해 필요한 10, w 값 공간을 할당해주고 PC(Program Counter) 라는 것을 통해서 Turn을 Volt 함수로 넘긴다.

 

 

2) Start Callee(불려진 놈의 계산 시작, Reverse Stack for The Function)

 

 

- R6의 주소값이 줄면서(위로 이동) Volt가 끝나면 Watt로 돌아갈 주소(address) 그리고 그 때 가져갈 값(return value)을 저장할 메모리를 할당 [return address ==> w=Volt(w,10) 요기

 

- 현재 실행하고 있는 함수의 제일 끝 점이 R5 다.

 

- Volt를 끝내고 Watt로 돌아갈 위치( 위 그림에서 R5 원래위치 ) 를 저장하기 위해 또 R6를 줄인다. 그리고 나서 R5를 R6위치로 포인팅하고 또 R6는 한 칸 줄인다. 이제야 R5가 Volt 끝자락으로 왔으니 Volt를 계산하기 위한 Stack이 완성된 것!

 

- Volt local Variable 저장을 위해 R6를 또 줄이고 변수들을 저장해준다.

 

 

3) End Callee ( RETURN )

 

 

- Volt에서 k라는 value를 return하면서 동작을 끝낸다.

 

- 그 Return 값을 R5에서 3칸 내린 곳에 저장! 그리고 필요 없어진 Local Var 삭제 ( R6는 2칸 내린다 )

 

- R6가 가르키고 있는 정보 -> WATT를 위한 Frame Pointer 정보를 R5에게 저장

 

- R5 복귀, 다시 Watt에게 Control 권한을 준다.

 

 

4) Return to Caller

 

 

- Return value를 원래 w에다가 넣고 POP( w = Volt(~~)  요기다가 넣는다는 ) 

 

- q,r 등 필요 없어진 메모리 삭제! --> Volt와 관련된 메모리구조 전부 사라짐

 

- 위 일련의 과정에서 R6는 한 칸 씩 내려오고 있었음 POP 하면서!

 

총 정리

 

 

- C 함수 Call 과정에선 가장 나중에 만들어진(PUSHED) 메모리가 가장 먼저 사라지게 되어있다(POP)

 

- LIFO --> STACK 구조!

 

 

아무 생각 없이 썼던 C 함수..

 

메모리는 이렇게 열심히 생성과 사라짐을 반복하며 돌고 돌고 있었다.

 

 

 

 

'SW 만학도 > C' 카테고리의 다른 글

Review 1 - C programming basics  (0) 2024.07.03
5. Pointer - Motivation in C  (1) 2024.03.26
3. Control Structures in C - Condition ( While / For Loop )  (0) 2024.03.25
2-1. Operators / Memory in C  (0) 2024.03.20
2. Variables in C  (0) 2024.03.20