함수 return 값으로 지금까지 1 , 3.3 등의 값을 가져왔다. 그렇다면 포인터(메모리 주소)를 return 하려면 어떻게 해야 할까?
●포인터 반환 함수 문법
반환값자료형 *함수이름()
{
return 반환값;
}
코드 예시를 보자
●포인터 반환 함수 코드 예제
#include <stdio.h>
int *five() // int 포인터를 반환하는 five 함수 정의
{
int num = 5; // num은 함수 five 함수가 끝나면 사라짐
return # // 함수에서 지역 변수의 주소를 반환하는 것은 잘못된 방법
}
int main()
{
int *numPtr; //포인터 변수 선언
numPtr = five(); // 함수를 호출하고 반환값을 numPtr에 저장
printf("%d\n", *numPtr); // 역참조를 하려 하지만, 지역변수의 주소를 참조할 수 없음
return 0;
}
num 은 five 함수 안에서만 사용할 수 있는 지역변수이고 따라서 함수가 끝나면 사라진다. 그래서 num의 주소를 반환하는 것은 잘못되었다.
▲위의 문제를 해결하기 위해서는 malloc 함수로 메모리를 할당한 뒤 return 해줘야 한다.
●malloc 함수로 메모리를 할당하여 return 하는 코드 예제
#include <stdio.h>
#include <stdlib.h> //malloc, free 함수 선언된 헤더 파일
int *five() // int 포인터를 반환하는 five 함수 정의
{
int *numPtr1 = malloc(sizeof(int)); // int 크기만큼의 동적 메모리 할당
*numPtr1 = 5; //역참조로 5 저장
// 동적 메모리를 할당해주면 함수가 끝나도 사라지지 않음
return numPtr1; // 5의 메모리 주소 return
}
int main()
{
int *numPtr; //포인터 변수 선언
numPtr = five(); // 함수를 호출하고 반환값을 numPtr에 저장
printf("%d\n", *numPtr); // 5:메모리 해제 전까진 값 O
free(numPtr); //다른 함수에서 할당한 메모리여도 반드시 해제 필수
//동적 메모리는 함수를 벗어나도 유지되므로 해제 안하면 메모리 누수 발생
return 0;
}
'프로그래밍 언어 > C' 카테고리의 다른 글
C언어 33강)+ 함수에서 문자열 포인터 반환 (0) | 2020.11.21 |
---|---|
C언어 18강)+ 포인터 변수 선언 (0) | 2020.11.21 |
C언어 32강)+ 열거형(enum) switch문에 활용하기 (0) | 2020.11.18 |
C언어 32강) 열거형 (enum) (0) | 2020.11.18 |
C언어 31강) 함수에 포인터 매개변수 활용하기 (함수 return 값 여러개 반환하는 방법) (0) | 2020.11.17 |