[C] 함수의 데이터 공유 방법 (int * 함수)
C로 코딩을 하다보면 빠질 수 없이 등장하는 것이 바로 함수 이다.
반복적인 동작을 수행하거나 코드의 전체적인 가독성을 위해서 꼭 필요한 것이 바로 함수이다.
오늘은 함수가 어떻게 데이터를 공유하는지 알아보자.
여기서 데이터란 1. 매개변수 값과 2. 리턴 값을 생각해 볼 수 있다.
우선 다음과 같은 예제를 살펴보자
다음과 같은 경우, main() 에서 int형 변수 x와 y를 test라는 함수의 매개변수로 넘겨주었다.
이 때, x와 y의 값이 a와 b로 선언된 변수에 복사되어 들어간다. 또한, a와 b의 합한 값이 sum 으로 선언된 변수에 복사되어 들어간다.
즉, 함수의 매개변수는 직접적으로 변수 자체를 넘겨받는것이 아니라, 변수 속의 값만 복사되어 넘겨지는 것이다.
그렇다면 다음예시를 살펴보자
위의 예시의 경우 s1이라는 포인터 변수는 "hello"라는 문자열의 시작 주소값을 가리키고 있는 상태이다.
이때, test라는 함수에게 s1을 넘겨주었는데, 그러면, s2라는 포인터 변수에는 s1이 복사되어 들어간다.
앞서 말했듯이 s1은 "hello"라는 문자열의 시작주소값을 담고있는데, s2라는 포인터 변수에 그 주소값이 담겨지므로, 포인터 변수 s2도 "hello"라는 문자열의 시작 주소값을 가리키게 된다.
위의 과정을 그림으로 나타내보면 다음과 같다.
즉, s1과 s2 는 같은 주소값을 담고 있는 변수이다.
하지만 s1 과 s2는 명백하게 다른 변수이므로, s2의 값을 바꾸어도 s1은 변함없이 같은 곳을 가리키고 있을 것이다.
다음으로 주소값을 반환하는 함수를 생각해보자.
위의 예시의 경우 함수가 a라는 변수의 주소값을 반환하고 있다.
이때, 주소를 반환하니 일반적인 int형을 리턴하면 안되고, 주소값을 리턴하기 위해서 int * 형을 반환자료형으로 설정해준다.
주소값을 리턴하니까 int & 형으로 리턴해야 하는거 아닌가?
라고 생각할 수도 있겠지만, int * 형을 가지는 변수는 주소값을 가지고있으므로, 이렇게 설정해주어야 주소값이 그 변수안에 담길 수 있다.
다만, 위와같이 주소값을 리턴하는 함수의 경우, 함수가 종료되는 순간 지역변수 a를 위해 할당되어있던 메모리 공간은 사라지므로 p가 가리키는 공간은 오염될 수도 있다.
물론 위와같은 간단한 프로그램의 경우 그럴일은 없겠지만, 복잡한 프로그램의 경우 지역변수의 주소값을 반환하는 것은 위험하므로, 지역변수 a 앞에 static을 넣어주어 정적지역변수로 만들어 주어야 한다.
내용 정리해보면,
1. 함수의 매개변수는 변수가 그대로 넘어가는 것이 아니라, 변수 속의 값이 복사되어 넘어간다.
2. 주소값을 반환하는 함수의 경우 리턴형에 *를 붙여주어야 한다.
3. 지역변수를 반환하는 것은 위험하다.
본내용은 공부를 하며 정리한 것으로, 오류가 있을 수 있습니다.