inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

문자열 관련 질문 드립니다

해결된 질문

286

두부두부

작성한 질문수 1

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

c kernel secure-coding

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

병행성 제어

0

41

2

질문이 있습니다(강의와 거의 상관이 없는)

0

70

2

컴파일러 서적 질문입니다

0

154

1

코드생성 및 최적화 질문입니다

0

151

1

Hex Editor를 이용한 다국어 번역 관련 질문입니다

0

206

2

큐의 배열을 넘겨도 정상작동합니다

0

155

2

캐너리비트에 관하여 질문

0

207

3

상수화된 문자열에 질문있습니다

0

167

1

함수 호출 매개변수 전달에 대한 질문 드립니다.

0

187

1

단항 증감 연산에 따른 다른 접근에 대한 질문있습니다.

0

203

2

함수호출 규약 종류에 따른 장단점 여부

0

221

2

정적라이브러리 링크 오류

0

221

1

const char *를 char*에 초기화할때의 컴파일 에러 처리 방식 문의

0

348

2

pszParam 수정이 왜 Hello World print에도 영향을 미치는지 이해가 잘 안됩니다.

0

248

2

비선형 자료구조

0

307

1

자료 구조 공부 후에

0

348

1

강의자료 관련

0

248

1

마지막에 말씀하신 부분 질문드립니다.

0

209

1

라이브러리

0

269

1

부동소수점

0

386

1

왜 변수 주소 사이에 offset이 있는 건가요?

0

297

2

stack 쌓는 순서

0

500

1

함수호출이랑 쓰레드

0

404

1

리눅스 환경도 스레드 생성 원리는 동일한건가요?

0

522

1