을 입력있다 프로그램의 "Hello"컴파일러는 프로그램의 데이터 영역에 문자 배열을 만듭니다 (Data Segment).
당신은 할당 할 때 :
p="Hello";
컴파일러는 데이터 세그먼트에서 리터럴 문자열의 주소를 받아 포인터 변수 P에 넣습니다.
문자열 리터럴은 숫자 리터럴과 다릅니다. 문자열 리터럴 유형은 const char[]
입니다. char * 포인터에 할당 할 수 있습니다. 정수 리터럴은 그냥 int
유형입니다.
숫자 리터럴은 데이터 세그먼트에 저장할 필요가 없습니다. 대부분의 경우 이러한 리터럴은 기계어 명령어에 직접 배치됩니다. 따라서 여러분이 가리킬 수있는 주소가 없습니다. 당신이 (당신의 의견에 따라)이 작업을 수행하려고하면
:
int *p;
*p = 5;
당신이 실제로 말하는 것은 당신이 위치에 숫자 5가 P가 가리키는 저장할 것입니다 (정의되지 않은 어떤 일 것 이 경우에는 p를 설정하지 않기 때문에). 당신은 아마 세그 폴트를 얻을 것입니다. 이 작업을 수행하려고하면
: 당신은, 결과 그와 정수에 대한 포인터에 값 5를 변환 페이지에 그를 저장하기 위해 할 수있는 컴파일러되는 이야기 일 것입니다 무슨
int *p;
p = 5;
포인터 p는 이제 주소 5.를 가리키는 그리고 당신은 아마이 같은 경고를 얻을 것이다 : 즉
t.c:7: warning: assignment makes pointer from integer without a cast
, 당신은 포인터에 정수를 변환하려고 - 당신은 당신이 일을하려고 줄 알았는데 아마 어떤 .
내가 기억하는 한, 힙의 정적 부분에있는 문자열입니다. 그 찌르기를 조작하면 자동으로 사본으로 작업합니다 – rekire
[char \ * str; str = "HELLO"; 어떻게 그 문자열에 대한 메모리를 할당하지 않고 작동합니까?] (http://stackoverflow.com/questions/19720856/char-str-str-hello-how-thoes-work-without-allocating-any-memory- for-the) – Drop