본문 바로가기

C언어/C언어 문법

[C언어] 포인터 반환 함수

728x90
반응형

포인터 반환 함수

 

포인터 반환 함수를 선언하는 방법은 반환값의 자료형과 함수 이름 사이에 *을 붙여주면 된다.

 

그러나 아래 코드처럼 작성할 경우 제대로 사용이 불가능할 것이다.

 

int *Num()
{
	int num = 5;
	return #
}

 

 

위 코드처럼 사용하게 되면 지역변수인 num은 Num함수의 호출이 종료되면 사용이 끝났다고 판단되어서

프로그램 실행 중에 값이 손상될 수 있기 때문이다.

 

 

 

따라서 올바른 포인터 반환 함수의 사용법은 아래와 같다.

 

 

int *Num()
{
	int *ptr = malloc(sizeof(int));
	*ptr = 5;
	return ptr;
}

 

 

동적할당으로 메모리를 할당해주면 함수가 끝났을 때 ptr을 역참조 할 수는 없지만 free 함수로 메모리를 해제하기 전까지

메모리 자체는 유지되기 때문에 주소만 알고 있다면 같은 값에 접근할 수 있다.

 

따라서 아래 코드처럼 접근하는 것이 가능하다.

 

#include <stdio.h>
#include <stdlib.h>


int *Num()
{
	int *ptr = malloc(sizeof(int));
	*ptr = 5;
	return ptr;
}

int main()
{
	int *MainPtr = NULL;
	
	MainPtr1 = Num();
	printf("%d\n", *MainPtr1);
	
	free(MainPtr1);
	return 0;
}

 

 

 

 

 

 

이 때 Num 함수를 다시 호출해도 같은 값을 불러올 수는 없다.

 

ptr을 새로 만들어 메모리를 할당하는 것이기 때문에 각각 다른 값이 돼버린다.

 

#include <stdio.h>
#include <stdlib.h>


int *Num()
{
	int *ptr = malloc(sizeof(int));
	*ptr = 5;
	return ptr;
}

int main()
{
	int *MainPtr = NULL;
	int *MainPtr = NULL;
	
	MainPtr1 = Num();
	MainPtr2 = Num();
	
	*MainPtr1++;
	printf("%d %d\n", *MainPtr1, *MainPtr2);
	
	free(MainPtr1);
	free(MainPtr2);
	return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

포인터 반환 함수의 응용

 

그래서 포인터 따위를 반환해서 어디에 쓰려는 것일까?

 

정수나 실수 등 자료형은 그냥 반환하여 변수에 대입하면 될 것이다.

 

 

그러나 문자열이나 배열의 경우 반환하기가 힘들 것이다.

 

이럴 때 포인터의 주소만 반환하면 그대로 값을 가져오는 것이 가능하다!!

 

#include <stdio.h>
#include <stdlib.h>


char *HelloWorld()
{
	char *ptr = malloc(sizeof(char)*13);
	ptr = "Hello World!";
	return ptr;
}

int *Arr()
{
	int *arr = malloc(sizeof(int)*4);
	int i;
	for (i=0;i<4;i++)
		arr[i] = i*2;
	return arr;
}

int main()
{
	char *MainPtr1 = HelloWorld();
	int *MainPtr2 = Arr();
	int i;
	
	printf("%s\n", MainPtr1);
	
	for (i=0;i<4;i++)
		printf("%d ", MainPtr2[i]);
	
	free(MainPtr1);
	free(MainPtr2);
	return 0;
}

 

 

 

 

 

값을 잘 받아온 모습을 확인 할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형