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
반응형
'C언어 > C언어 문법' 카테고리의 다른 글
[C언어] 상수형 포인터 (Const Pointer) (0) | 2024.02.18 |
---|---|
[C언어] scanf 호출 시 &연산자를 사용하는 이유 (0) | 2024.02.18 |
[C언어] Call By Reference (0) | 2024.02.16 |
[C언어] 함수 포인터 배열 (0) | 2024.02.15 |
[C언어] 함수 포인터 (0) | 2024.02.14 |