2015-01-21 2 views
0

문자열 리터럴에 대한 몇 가지 기본적인 질문이 있습니다. 그래서 질문을 몇 가지 유사한 겪고 시도하지만, 난 여전히 :(그것을 얻을하지 않습니다C 문자열 리터럴

우리가 예를 들어 다음과 같은 프로그램이있는 경우 :.?

char firstlit[] = "First Literal"; 
int main() 
{ 
char secondlit[] = "Second Literal"; 
} 

이 방법으로 초기화 문자열을 리터럴이 경우

둘 다 데이터 섹션에 저장되어 있습니까? 일부 데이터를 코드 세그먼트에 저장할 수있는 곳을 보았습니다. 이유는 무엇입니까?

그들 사이의 유일한 차이점은 무엇입니까? secondlit에는 문자열이 초기화되는 주소에 대한 포인터가 포함되어 있지만이 변수는 주에서 사용할 수 있지만 firstlit은 전체 파일 (전역)에서 사용할 수 있습니까? 또 다른 질문 :

char *ptr = "Hello"; 
char secondptr[] = "Hello"; 

이 둘은 실제로 방식에서 동일는 저장됩니까? 문자열 리터럴에 더 좋은 방법은 무엇입니까? 정말 많은 질문에 사과드립니다. 감사합니다. .

+1

왜 그렇게 많은 질문이 있습니까? – haccks

+0

@haccks 왜 그렇게 심각한가요? – bolov

+0

@ 볼로프; 나는 대답하기로 마음 먹었지만 지금은 마음이 바뀌었다. – haccks

답변

3

당신은 귀하의 질문에 정확히 하나의 문자열 리터럴 개체가 :

char *ptr = "Hello"; // The array containing Hello\0 

모든 다른 사람은 단지 배열에 대한 초기화, 전혀 경우가 저장되는 방법, 보장은 없다.

  • 문자열 리터럴 및 상수 복합 리터럴은 공백을 공유 할 수 있으며 변경할 수 없습니다.
  • 그럼에도 불구하고 문자열 리터럴은 역사적인 이유로 char[] 유형입니다.
  • 그리고 실행 섹션이 저장되어 있는지 또는 실행 섹션이 있는지에 대한 보장은 없습니다.
  • 불변이라는 사실을 무시하면 어떻게 될지는 아무런 보장이 없습니다. 자신의 위험을 감수하십시오.
3

firstlit과 secondlit은 리터럴이 아닙니다. 둘 다 초기화 된 문자 배열입니다. firstlit는 함수 본문 외부에서 선언되므로 데이터 세그먼트에 있습니다. 시작시 한 번 초기화됩니다. secondlit은 함수 내에서 선언되므로 스택 세그먼트에 있습니다. 함수가 입력되면 초기화됩니다.