2010-12-05 6 views
2

I은 ​​다음 두 선언 및 초기화에 주소 문자열을 인쇄하고 charArray 및 strPtr. 문제는 "왜?"CHAR * 변수 주소

인쇄 :

printf("%10s%40s%20p\n", "strPtr", strPtr, &(*strPtr));  
    printf("%10s%40s%20p\n", "charArray", charArray, charArray); 

출력 :

strPtr  This is a string, made on the fly.   0x400880  
charArray   Chars in a char array variable.  0x7fff12d5ed30 

서로 다른 주소를, 당신이 보는대로이 있습니다 : 0x400880 대 0x7fff12d5ed30

이 주소를 사용하기 전에 선언 된 변수의 나머지 charArray와 같습니다.

"주소가 너무 다른 이유는 무엇입니까?" 도움을 주셔서 감사합니다.

+4

몇 가지 조언; 예를 들어'const char * str = "string";'처럼 문자열 리터럴에 대한 포인터를 선언하는 것이 더 유리합니다. 이렇게하면 문자열 리터럴을 수정하려고하는 정의되지 않은 동작을 방지하는 데 도움이됩니다. – dreamlax

+0

@dreamlax +1 견고한 조언 – Gemini14

답변

3

컴파일러/링커가 스택에 char 배열을 넣는 반면, 다른 문자열은 정적 문자열 테이블에 저장됩니다.

4

문자열 리터럴, 예 : "foo bar"는 char 배열과 "다른 위치"에 할당됩니다.

구현에 의존하지만, 전형적인 구현에 문자열 리터럴을 넣어 것이다 .rdata ("읽기 전용 데이터") 실행 파일의 섹션과 문자 배열의 로컬 선언, 따라서 스택에 진행됩니다.

RAM에로드 될 때 이미지의 다른 섹션이 크게 다른 주소로 매핑됩니다.

2

"문자 배열 변수의 문자"텍스트 "이것은 날아 다니는 줄입니다." 아마 서로 아주 가깝다. 그러나 char charArray[] = ...은 해당 텍스트 비트가 복사되는 스택에 공간을 요청합니다. OS가 가상화 등으로 완료되면 스택은 실제 하드 코딩 된 텍스트와는 다른 우주에 있습니다.

2

이것은 어떻게 진행됩니까? [Unix : Systems Programming] 초기화되지 않은 정적 데이터에 반대 정적 데이터를 초기화 볼 수 alt text

1

는 힙의 다른 위치에 저장됩니다.

1

여기에 실현하기 위해 중요한 것은 charArray의 경우, 당신은 단지 다루고있는 반면 strPtr의 경우, 당신은 다른 개체를 다루고 있다는 점이다.

charArray"Chars in a char array variable." 문자열의 문자로 채워진 단일 배열 객체입니다.

strPtr 자체는 단일 포인터 개체입니다. 이 값은 "This is a string, made on the fly." 문자열의 문자를 포함하는 두 번째 익명의 수정 불가능한 배열 객체의 주소입니다.

charArray%p을 사용하여 인쇄하면 charArray[0]의 주소가 인쇄됩니다 (배열의 특별 규칙으로 인해). &(*strPtr) (이는 정확히 strPtr과 동일 함)을 인쇄하면 앞에서 언급 한 익명의 수정 불가능한 배열 객체의 주소가 인쇄되므로 다른 변수의 주소와 많이 다른 것처럼 보입니다.

%p을 사용하여 인쇄하면 strPtr 변수의 주소가 다른 로컬 변수와 비슷한 범위에 있음을 알 수 있습니다.