문자열상수와 정적데이터영역

  • chawoo77
    chawoo77

    문자열상수의 사용에 대해 질문 드립니다.
    우선 제가 알기로는 문자열상수는 정적데이터영역에 저장되어
    사용된다고 알고 있습니다.
    따라서, 당연히 메인함수 이외의 함수에서도 사용할 수 있는데요.
    그렇기 때문에 다른 함수에서도 사용하고 그 포인터는
    돌려 줄 수도 있다는 생각을 기초로 하여 아래와 같은 프로그램을 보면......

    char* sss(void)
    {
        return "Hello";  //문자열상수 "Hello"의 포인터를 리턴합니다.
    }
    
    int main(void)
    {
        printf("%s", sss());  //포인터를 받았으니 바로 출력가능하죠.
        return 0;
    }
    

    즉, sss라는 함수가 소멸되어도 문자열상수는 정적데이터영역에 저장되기 때문에 그 포인터 값을 안다면 출력하거나 다시 불러낼 수 있다는 생각에 작성한 프로그램입니다.
    물론 컴파일시 이상없이 잘 작동합니다.
    그런데 알고스팟에서 위와 같은 원리로 문제를 제출했는데
    컴파일실패라고 나오더군요. 잘못된 라인을 보니 전부 저렇게 문자열 상수를 리턴한 곳에서 전부 경고가 떠서, 함수에 별도의 char* 포인터를 받을 수 있는 매개변수를 추가한다음 메인에서 또 별도의 char* 형을 선언하고 또 넘겨주어서 그 값에 문자열 상수를 저장받아서 다시 출력하는 식으로 하니 컴파일실패가 없어졌습니다. 되기는 하나 위의 방법이 개인적으론 간략하다고 생각되는데......

    위의 방법이 잘못된 방법인가요?
    그리고 알고 있던 지식으로는 문제가 될거 같진 않은데......
    일단 제 컴퓨터 상에서도 경고가 뜨질 않긴한데....
    어떤가요?

    감사합니다.


    10년 전
2개의 댓글이 있습니다.
  • Being
    Being

    const char * 형을 쓰시면 문제가 없을 겁니다. 자세한 내용은 언어 공부를 조금 더 하시면 도움이 될 듯 합니다.


    10년 전 link
  • chawoo77
    chawoo77

    아...const가 없어서 경고가 나올 수도 있겠군요.
    감사합니다.


    10년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.