궁금증 연구소

안녕하세요. 궁금증연구소입니다.

오늘 포스팅 주제는 "Suspicious pointer conversion 에러"입니다.

 

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


main()
{
    char *p;

    p = getStr();
    printf("%s\n", p);
}

char *getStr(){

    char na[20] = "Mega";

    return na;
}

위와 같이 함수 내에서 만든 문자열 배열을 리턴해주면 다음과 같은 에러가 발생합니다. 이유는 함수내에서 지역변수인 문자열 배열의 변수 공간은 함수가 끝나는 순간 사라지기 때문입니다.

 

suspicious pointer conversion error message

 

#include <stdio.h>

char *getStr();


main()
{
    char *pstr;
    pstr = getStr();
    printf("%s\n", pstr);
}

char *getStr()
{
    char *na="Mega";
    // char na[20]= "Mega";
    
    return na;
}

따라서 위와 같이 문자열 배열이 아니라 문자열 포인터를 리턴해주는 형태로 바꿔주면, 에러 없이 실행이 됩니다.

같은 문자열 "Mega"를 저장하고 있지만, 문자열 포인터는 데이터 영역에 있는 상수 문자열을 가리키고 있고, 문자 배열에 들어 있는 "Mega"는 스택 영역에 저장되어 있습니다.

 

#include <stdio.h>
#include <string.h>


char *getStr()
{
    char *na = new char[20];
    strcpy(na, "Mega");
    
    return na;
    
main()
{
    char *pstr;
    pstr = getStr();
    printf("%s\n", pstr);
}

}

따라서 함수 내에서 문자열을 리턴해줄 때에는 문자열 상수를 가리키는 포인터나 동적 할당하여 heap 영역에 할당된 문자열 포인터를 리턴해야 에러 없이 처리할수 있습니다. 위와 같이 동적할당을 하여 리턴하는 경우도 에러없이 잘 처리됩니다.

 

#include <stdio.h>
#include <string.h>

struct String
{
    char na[20];
};


String getStr(void)
{
    String na = {"Mega"};
    
    return na;
}

main()
{
    String name;
    name = getStr();
    printf("%s\n", name.na);
}

 

위와 같이 구조체 형태로 리턴하는 경우에는 리턴시 값이 사라지지 않고 임시 메모리에 보관된 값이 리턴되기 때문에 에러 없이 처리할 수 있다. 구조체 형태의 경우, 초기화를 사용하면 문자열을 쉽게 복사할 수 있기 때문에 문자열을 다룰 때 구조체를 이용하는 것은 좋은 방법이라고 볼 수 있다.

 

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading