Call by Value 와 Call by Reference 의 차이에 대해 이야기합니다.
아래 하나의 예제를 보겠습니다.
#include <stdio.h>
void call_by_value(int test)
{
test = test + 10;
printf("call by value address %p\n", &test);
}
int call_by_value_return(int test)
{
test = test + 10;
printf("call by value address %p\n", &test);
return test;
}
void call_by_reference(int *test)
{
printf("call by reference %p\n", test);
*test = *test+1;
}
int main()
{
int value = 10;
printf("val %d\n", value);
printf("val address %p\n", &value);
printf("-------------------------\n");
call_by_value(value);
printf("val %d\n", value);
printf("val address %p\n", &value);
printf("-------------------------\n");
call_by_reference(&value);
printf("val %d\n", value);
printf("val address %p\n", &value);
printf("-------------------------\n");
int value_return = call_by_value_return(value);
printf("val %d\n", value);
printf("val address %p\n", &value);
printf("val_return %d\n", value_return);
printf("val_return address %p\n", &value_return);
return 0;
}
아래 간단한 C코드의 결과이다.
위 결과가 위 처럼 나온 것을 이해하기 위해선 메모리에 대한 고민이 필요합니다.
우선, 메모리에는 컴파일 전 메모리를 할당하는 데이터 영역과 스택(Stack)영역과 힙(Heap)영역이 있습니다.
- 데이터(Data) 영역 (정적 메모리)
- 전역 변수와 static 변수가 할당되는 영역
- 프로그램의 시작과 동시에 할당되고 프로그램이 종료되어야 메모리에서 소멸됨
- 스택(Stack) 영역
- 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역
- 함수 호출이 완료되면 사라짐
- 힙(Heap) 영역
- 동적으로 할당된 변수
데이터 영역과 힙 영역은 사용되고 있지 않습니다.
스택 영역의 현재 코드를 그림으로 간단히 나타내면,
스택영역은 컴파일하면서 Stack영역을 위 사진 같이 메모리를 할당합니다.
Call by Value는 Main 함수에서 다른 함수로 인자의 값을 전달하기 때문에, Main 함수의 인자와 다른 함수의 인자는 서로 다른 주소를 가집니다. 그렇기 때문에 다른 함수에서 인자 값이 변하더라도 Main 함수의 인자는 다른 변수이기 때문에 아무 일도 일어나지 않습니다.
Call by Reference는 Main 함수에서 다른 함수로 인자의 주소 값을 전달하기 때문에, Main 함수의 인자와 다른 함수의 인자는 서로 같은 주소를 가집니다. 그렇기 때문에 다른 함수에서 값이 인자 값이 변하더라도 Main 함수의 인자는 같은 변수 이기 때문에 변하게 됩니다.
728x90
반응형
'C, C++' 카테고리의 다른 글
[C, C++] #define을 사용하는 이유 (0) | 2022.10.05 |
---|---|
[CPP] strcpy_s 사용 예제 (0) | 2021.08.23 |
[C] UNION 공용체와 Struct 구조체를 이용해 간단한 패킷 만들기 (1) | 2021.01.20 |
[C] 구조체 포인터 접근과 최적화 (0) | 2021.01.19 |
[C]BMP구조체 : #pragma pack(push,1 )사용하지 않고 정렬하기 2탄 (0) | 2020.03.02 |