링커, 로더, 실행 파일
C 언어의 「char *p = "hello"; p[0] = 'H';」를 실행하면 많은 환경에서 비정상 종료된다. 그 이유로 올바른 것은?
- A문자열이 스택에 놓여 있었는데 함수에서 돌아와 사라졌기 때문
- B문자열 리터럴은 쓰기가 금지된 .rodata에 놓이는데, 거기에 쓰려고 했기 때문
- Cp가 0으로 초기화되어 있었기 때문
정답과 해설 보기
정답: B. 문자열 리터럴은 쓰기가 금지된 .rodata에 놓이는데, 거기에 쓰려고 했기 때문
"hello" 같은 문자열 리터럴이나 const를 붙인 전역 상수는 읽기 전용 데이터 영역(.rodata)에 놓입니다. 이 페이지는 쓰기가 금지되어 있으므로 쓰려고 하면 CPU가 보호 위반을 검출하고 OS가 프로그램을 중단시킵니다(세그멘테이션 오류). 고쳐 쓰고 싶다면 「char s[] = "hello";」처럼 배열로 만들면 쓰기 가능한 영역에 사본이 만들어집니다.
- A. 문자열 리터럴은 프로그램 실행 중 계속 남아 있습니다.
- B. 올바릅니다. 쓰기에서 보호 위반이 됩니다.
- C. p는 문자열의 시작을 가리키고 있습니다.