문자열상수의 사용에 대해 질문 드립니다.
우선 제가 알기로는 문자열상수는 정적데이터영역에 저장되어
사용된다고 알고 있습니다.
따라서, 당연히 메인함수 이외의 함수에서도 사용할 수 있는데요.
그렇기 때문에 다른 함수에서도 사용하고 그 포인터는
돌려 줄 수도 있다는 생각을 기초로 하여 아래와 같은 프로그램을 보면......
char*sss(void){return"Hello";//문자열상수 "Hello"의 포인터를 리턴합니다.}intmain(void){printf("%s",sss());//포인터를 받았으니 바로 출력가능하죠.return0;}
즉, sss라는 함수가 소멸되어도 문자열상수는 정적데이터영역에 저장되기 때문에 그 포인터 값을 안다면 출력하거나 다시 불러낼 수 있다는 생각에 작성한 프로그램입니다.
물론 컴파일시 이상없이 잘 작동합니다.
그런데 알고스팟에서 위와 같은 원리로 문제를 제출했는데
컴파일실패라고 나오더군요. 잘못된 라인을 보니 전부 저렇게 문자열 상수를 리턴한 곳에서 전부 경고가 떠서, 함수에 별도의 char* 포인터를 받을 수 있는 매개변수를 추가한다음 메인에서 또 별도의 char* 형을 선언하고 또 넘겨주어서 그 값에 문자열 상수를 저장받아서 다시 출력하는 식으로 하니 컴파일실패가 없어졌습니다. 되기는 하나 위의 방법이 개인적으론 간략하다고 생각되는데......
위의 방법이 잘못된 방법인가요?
그리고 알고 있던 지식으로는 문제가 될거 같진 않은데......
일단 제 컴퓨터 상에서도 경고가 뜨질 않긴한데....
어떤가요?
chawoo77
문자열상수의 사용에 대해 질문 드립니다.
우선 제가 알기로는 문자열상수는 정적데이터영역에 저장되어
사용된다고 알고 있습니다.
따라서, 당연히 메인함수 이외의 함수에서도 사용할 수 있는데요.
그렇기 때문에 다른 함수에서도 사용하고 그 포인터는
돌려 줄 수도 있다는 생각을 기초로 하여 아래와 같은 프로그램을 보면......
즉, sss라는 함수가 소멸되어도 문자열상수는 정적데이터영역에 저장되기 때문에 그 포인터 값을 안다면 출력하거나 다시 불러낼 수 있다는 생각에 작성한 프로그램입니다.
물론 컴파일시 이상없이 잘 작동합니다.
그런데 알고스팟에서 위와 같은 원리로 문제를 제출했는데
컴파일실패라고 나오더군요. 잘못된 라인을 보니 전부 저렇게 문자열 상수를 리턴한 곳에서 전부 경고가 떠서, 함수에 별도의 char* 포인터를 받을 수 있는 매개변수를 추가한다음 메인에서 또 별도의 char* 형을 선언하고 또 넘겨주어서 그 값에 문자열 상수를 저장받아서 다시 출력하는 식으로 하니 컴파일실패가 없어졌습니다. 되기는 하나 위의 방법이 개인적으론 간략하다고 생각되는데......
위의 방법이 잘못된 방법인가요?
그리고 알고 있던 지식으로는 문제가 될거 같진 않은데......
일단 제 컴퓨터 상에서도 경고가 뜨질 않긴한데....
어떤가요?
감사합니다.
11년 전