본문 바로가기

지식/VC++

함수의 인자로 포인터 사용시 주의사항

함수의 인자로 포인터를 사용시 주의 할 사항을 몇 개 적어본다.
함수의 인자로 포인터가 사용되는 경우는 주로 메모리 관련이거자 직접 인자값을 수정할 경우인데

후자의 경우는 대부분 알고 있을터?
가령

void change_value(int value)
{
    value = 1;
}

void main()
{
    int a = 0
    change_value(a);
    printf("a = %d",a);
}

하면 필시 a는 0이다.
이럴 경우엔

void change_value(int *value)
void main()
{
    int a = 0
    change_value(&a);
    printf("a = %d",a);
}

로 해줘야 a값이 변하는것을 알 수 있다.
이런경우야 항시 배우고 쓰고있다지만 다음과 같은 경우를 생각해보자

void get_mem(char *p)
{
    p = (char*)malloc(100);
}

void main()
{
    char *p;
    get_mem(p);
    sprintf(p,"memory alloc");
}

이게 될까?
안된다. 가끔 나도 헤깔려서 위와같이 사용하는 경우가 있다.
포인터란놈자체가 주소값을 저장하는 변수이기 때문에 함수의 인자로 포인터를 그냥 넘겨주면 어차피
주소값을 넘겨주기 때문에 같은거 아니냐 라고 생각하실 수 도있지만 전혀 아니올시다.

제대로 메모리를 잡으려면

void get_meme(char **p)
{
    *p = (char*)malloc(100);
}

void main()
{
    char *p;
    get_mem(&p);
    sprintf(p,"memory alloc");
}

위와 같이 포인터의 레퍼런스 즉 포인터의 주소값을 넘겨야한다.
함수의 인자로 포인터 자제를 넘기면 물론 주소값이 전달되지만
그것은 포인터가 저장하고 있는 주소값이지 포인터 자체의 주소값이 아니므로
메모리 할당을 하여도 포인터 자체로 전달되는것이 아니고

함수내에서 생성한 변수의 주소값에 전달 되기 때문이다.
위의 경우엔 malloc의 경우지만 free의 경우도 마찬가지임을 명심하자.