프로그래밍 언어/C

C언어 33강) 함수에서 포인터 반환하기

happy_life 2020. 11. 20. 21:38

함수 return 값으로 지금까지 1 , 3.3 등의 값을 가져왔다. 그렇다면 포인터(메모리 주소)를 return 하려면 어떻게 해야 할까?

●포인터 반환 함수 문법

반환값자료형 *함수이름()
{
    return 반환값;
}

 

코드 예시를 보자

포인터 반환 함수 코드 예제

#include <stdio.h>

int *five()    // int 포인터를 반환하는 five 함수 정의
{
    int num = 5;   // num은 함수 five 함수가 끝나면 사라짐

    return &num;    // 함수에서 지역 변수의 주소를 반환하는 것은 잘못된 방법

} 

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;

}

결괏값

 

 

 

 

 

 

malloc함수

 

C언어 21강) malloc함수로 메모리 사용하기

포인터는 포인터 변수에 특정 변수의 메모리 주소를 저장하는 방식으로 메모리를 사용하였다. 이번에는 비슷하지만 조금 다른 방법을 소개하겠다. 바로 malloc 함수를 사용하는 것이다. malloc 함

abcdefgh123123.tistory.com