인프런 커뮤니티 질문&답변

두부두부님의 프로필 이미지
두부두부

작성한 질문수

독하게 되새기는 C 프로그래밍

문자열 관련 질문 드립니다

해결된 질문

작성

·

199

·

수정됨

0

우선 예제 코드를 먼저 보여드리겠습니다.

 

  1. char arr[13] = "Hello World\n";

  2. char* arrr = "Hello World\n";

  3.  

  4. printf("%p\n", &("Hello World\n"));

  5. printf("%p\n", arrr);

  6. printf("%p\n", arr);

 

"Hello World\n" 과 arrr이라는 포인터 변수의 대상이 완전히 일치한다는 것은 이해했습니다.

그래서 4행과 5행의 출력 결과는 같다는 것을 실습으로 확인했습니다.

그런데 6행의 출력 결과는 앞의 두 경우와 다르게 나왔습니다.

 

질문은 총 4가지입니다.

 

  1. 포인터 변수를 통해 직접 메모리 주소를 가져오는 것과

    배열을 통해 지역변수를 선언하여 문자 배열의 정보를 담는 것은 전혀 다른 것인가요?

  2. 그렇다면 1행의 정보는 stack 영역에 저장되는 것인가요?

  3. 배열도 상수화된 포인터이기에 1행과 2행이 같은 메모리 주소를 가리켜야 되는 것이 아닌가요?

  4. 2행에서 선언된 포인터 변수의 경우 배열 연산자로 접근하여 쓰기를 시도할 경우 엑세스 위반의 예외를 알려주는데 읽고 쓰는 권한 때문에 다른 메모리 주소를 가리키게 되는 것인가요?

답변 1

1

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

"Hello World\n" 문자열은 const char[] 형식입니다. 즉, 읽기 전용 char 배열입니다. 이 배열은 이름이 없습니다만 첫 글자 'H'가 저장된 메모리 주소로 식별 할 수 있습니다. 그리고 사용된 메모리 영역은 정적 메모리 영역이며 읽기 접근만 허용되는 영역입니다.

  1. 네, 전혀 다릅니다. arrr 포인터는 정적 메모리 영역에 저장된 문자열의 주소를 저장하고 있는 변수 입니다. 배열로 선언한 arr은 char[13] 배열이며 그 안에 저장된 정보가 Hello World 문자열입니다. 즉, 문자열 상수와 배열의 메모리 위치는 다릅니다.

  2. 지역변수이자 자동변수로 선언했다면 Stack 입니다.

  3. 배열은 상수화된 포인터가 아닙니다. 1번에서 설명한 것처럼 "Hello World" 문자열 상수가 저장된 메모리와 char arr[13]의 메모리 위치는 서로 다릅니다. 즉, 두 곳에 Hello World가 저장되어 있는 것입니다.

  4. 읽기 전용 메모리에 대해 쓰기 시도를 할 경우 예외가 발생하는 것과 다른 메모리 주소를 가리킨다는 말은 서로 관련이 없습니다. 참고하시기 바랍니다. 😄

두부두부님의 프로필 이미지
두부두부

작성한 질문수

질문하기