2013-12-14 6 views
-1

는 내가 가진 :함수의 상수 문자열 - 저장 위치는 어디입니까?

void func() 
{ 
    char *s; 
    strcpy(s,"bla bla"); 
} 

"즐 즐은"어딘가에 저장되어 있습니까? 내가 그것을 정의하지 않았더라도 "const char *"로 간주됩니까?

+1

프로그램이 정의되지 않은 동작을 실행합니다 (문자열을 저장하기 위해's'에 할당 된 공간이 없습니다). "bla bla"는 어딘가에 저장 될 수 있으며 그렇지 않을 수도 있습니다. 또한 악마가 코에서 빠져 나올 수도 있습니다 (http://www.catb.org/jargon/html/N/nasal-demons.html). – Kninnug

+3

@Kninnug : UB는 어디에 있습니까? 그리고 "bla bla"는 저장 공간이 없다고 생각하는 이유는 무엇입니까? 문자열 리터럴이고 프로세스의 정적 데이터 섹션에 행복하게 앉아 있습니다. – bitmask

+1

's'가 초기화되지 않은 포인터 인 동안 @bitmask를's'에 복사하는 것은 정의되지 않은 동작입니다. 컴파일러는''bla bla ''를 최적화 할 수 있을지 모릅니다. 왜냐하면 아무데도 갈 수 없기 때문입니다. – Kninnug

답변

-2

"blah blah"은 함수 내에 선언 된 다른 자동 변수 나 배열과 마찬가지로 스택에 저장됩니다.

구성은

char s[] = "blah blah"; 

char s[] = {'b', 'l', 'a', 'h', ' ', 'b', 'l', 'a', 'h', '\0'}; 

등가이며 어레이를 초기화한다.

문자 배열은 배열과 거의 같은 방식으로 동작하기 때문에 char * const으로 취급 할 수 있습니다. 기술적으로 말하면 배열은 배열이고 포인터는 포인터입니다. 그러나 이것은 const char *과 동일하지 않습니다. char * const은 포인터를 수정할 수 없음을 의미하고 const char *은 해당 포인터를 통해 메모리를 수정할 수 없음을 의미합니다.

+2

나는 downvote하지 않았지만, "blah blah"가 스택에 저장되었다는 내용은 틀렸다. 모든 문자열 리터럴은 정적 저장 기간을 가진 객체입니다. 즉, "스택에 저장"될 수 없음을 의미합니다. 그것은 "스택에 저장되어있는"s "이지만,"blah blah "(별도의 객체로 존재하는 경우)는 정적 메모리에 저장됩니다. – AnT

+2

저는이 질문을 "C 컴파일러가 할 수있는 것"이 ​​아닌 "C"질문으로 취급하고 있습니다. 언어 사양에서는 문자열 리터럴이 가리킬 때만 존재한다고합니다. 언어에 관한 한 모든 문자열 리터럴은 정적 메모리에서 이름이없는 배열 객체입니다. 옵티마이 저가 무엇을하기로 결정했는지에 관해서는 ... 그것은 언어와 아무런 관련이 없습니다. 어쨌든 리터럴은 a) 정적이거나 b) 최적화 된 것입니다. 어떠한 경우에도 "스택에 저장"하는 것이 옳은 대답입니다. – AnT

+0

그래, 분명히 동의한다. "ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋㅋㅋ –

2

문자열 리터럴은 이름이없는 배열 객체이며 정적 메모리, 즉 전역 변수를 저장하는 동일한 메모리에 저장됩니다. 문자열 리터럴은 영원히 존재합니다. 프로그램이 시작될 때 존재하며 프로그램이 끝날 때까지 계속됩니다 (글로벌 변수와 마찬가지로).

그러나 코드 샘플에서는 문자열 리터럴 인 "blah blah"입니다. 하지만 s은 문자열 리터럴에서 초기화 된 (데이터를 복사하여) 로컬 변수 일뿐입니다. s은 다른 로컬 변수와 동일한 수명을가집니다. 컨트롤이 func을 통과하는 한 존재합니다.

C의 문자열 리터럴은 사용자가 잘못 믿는 것처럼 const chart *으로 간주되지 않습니다. C 언어로 된 "blah blah"의 형식은 실제로 char [10]입니다. 배열 유형은 포인터 유형으로 감쇄 될 수 있지만 그 경우에도 char *이되며 const char *이 아닐 수 있습니다.

관련 문제