2014-03-07 2 views
3

다음 (적법한) c 코드에서 포인터 p에 명시 적으로 할당 된 메모리가 없습니다.명시 적으로 할당하지 않고 char *에 메모리 할당이 작동하는 방법

AFAIK, 명시 적으로 메모리를 할당하지 않고도 5을 가리 키도록 int *p을 가져올 수 없습니다.

int main() 
{ 
    char *p; 
    p = "Hello"; 
    return 0; 
} 
  • 어떻게 메모리가 메모리를 읽기 전용 데이터 섹션에서 할당됩니다 Hello 리터럴 문자열을 가리키는 "Hello"
+0

내가 기억하는 한, 힙의 정적 부분에있는 문자열입니다. 그 찌르기를 조작하면 자동으로 사본으로 작업합니다 – rekire

+0

[char \ * str; str = "HELLO"; 어떻게 그 문자열에 대한 메모리를 할당하지 않고 작동합니까?] (http://stackoverflow.com/questions/19720856/char-str-str-hello-how-thoes-work-without-allocating-any-memory- for-the) – Drop

답변

5

을 입력있다 프로그램의 "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 

, 당신은 포인터에 정수를 변환하려고 - 당신은 당신이 일을하려고 줄 알았는데 아마 어떤 .

+0

@ArjunSreedharan이 (는) 이해하는데 도움이되는 몇 가지 추가 정보로 업데이트되었습니다. – harmic

1

p에 할당 된 것

  • 다른 char* 포인터입니다. 그리고 수정할 때 정의되지 않은 동작이 발생하고 세그먼트 오류가 발생할 수 있습니다.

    C 표준 말한다

    문자열 리터럴은 - 문자 평범한 문자열은 "n 개의 CONST의 문자의 배열"과 같은 리터럴 문자열을 넣어 정적 저장 기간 (3.7)

  • 1

    C에서 "Hello"과 같은 문자열 리터럴은 char * 유형 값, 즉 기본 주소로 확장되어 char에 대한 포인터를 초기화하는 데 사용할 수 있습니다.

    런타임시 문자열 리터럴은 일반적으로 일부 읽기 전용 메모리 세그먼트에 있습니다.

    그런데 포인터 변수와 포인터 변수가 가리키는 주소를 혼동하는 것 같습니다. char *p; 같은 문장으로

    1. , 당신은 컴파일러가이 변수를 저장하는 데 필요한 메모리를 할당합니다, 포인터 변수를 정의. 그러나이 시점에서이 포인터는 초기화되지 않았으므로 결정된 값을 가지지 않으므로 아무 곳이나 가리킬 수 있습니다. p = "Hello"; 같은 문장으로

    2. 이, 당신은 지금 어떤 결정 메모리 주소를 가리키는 포인터 p 값 할당이 메모리 세그먼트는 컴파일러에 의해 할당 할 수도 있고, 예를 p = malloc(...);에 대해, 자신에 의해 할당 될 수있다.

    0

    작업이 컴파일러에 의해 완료되었습니다. 그것은 데이터 세그먼트에 공간을 할당하고 문자열 "Hello"를 저장하고이 배열의 기본 주소를 포인터 p1에 할당합니다.

    그러나이 배열 "Hello"는 const 배열입니다. 생성 된 데이터는 수정할 수 없습니다.

    데이터를 수정하려고하면 예기치 않은 결과가 발생합니다.

    관련 문제