1. 문제 개요
C 언어에서 문자열을 선언할 때 두 가지 주요 방식이 있습니다:
char s[] = "hello";
char *s = "hello";
이 두 방식은 비슷해 보이지만, 메모리 배치와 수정 가능성에서 중요한 차이를 보입니다. 이를 명확히 이해하면 메모리 관련 오류를 방지하고 더 안전한 코드를 작성할 수 있습니다.
2. char s[]
와 char *s
의 차이점
2.1 char s[]
의 동작 원리
- 문자열 복사:
"hello"
문자열은 읽기 전용 메모리에 저장되고, 배열s
는 해당 문자열을 복사하여 스택 메모리에 저장합니다. - 수정 가능: 배열
s
는 복사된 데이터이므로 수정 가능합니다.
char s[] = "hello";
s[0] = 'H'; // 정상적으로 작동
- 메모리 배치:
- 읽기 전용 메모리에
"hello"
가 저장됨. - 스택 메모리에 복사된
"hello"
가 저장됨.
- 읽기 전용 메모리에
2.2 char *s
의 동작 원리
- 문자열 포인터:
"hello"
문자열은 읽기 전용 메모리에 저장되고, 포인터s
는 해당 문자열의 시작 주소를 가리킵니다. - 수정 불가능: 읽기 전용 메모리를 가리키므로 문자열을 수정하려고 하면 정의되지 않은 동작이 발생합니다.
char *s = "hello";
s[0] = 'H'; // 런타임 오류 또는 세그멘테이션 오류 발생
- 메모리 배치:
- 읽기 전용 메모리에
"hello"
가 저장됨. s
는 이 문자열의 주소를 가리킴.
- 읽기 전용 메모리에
3. 사용 사례 및 주의사항
3.1 char s[]
를 사용할 때
- 문자열이 수정되어야 할 경우 적합합니다.
- 배열 크기가 고정되므로 문자열 크기를 초과한 값을 저장하려고 하면 버퍼 오버플로우 문제가 발생할 수 있습니다.
char s[] = "hello";
strcpy(s, "world"); // 정상 작동 (문자열 크기가 배열 크기를 초과하지 않을 경우)
3.2 char *s
를 사용할 때
- 문자열이 수정될 필요가 없고, 읽기 전용 문자열을 가리키기만 할 때 적합합니다.
- 포인터가 다른 문자열을 가리키도록 변경할 수 있습니다.
char *s = "hello";
s = "world"; // 정상 작동 (포인터가 새로운 문자열을 가리킴)
4. 핵심 요약
char s[]
: 문자열을 읽기 전용 메모리에서 복사해 스택에 저장하며, 수정 가능합니다.char *s
: 문자열의 읽기 전용 메모리 주소를 가리키며, 수정이 불가능합니다.- 배열(
char s[]
)은 주로 수정 가능한 문자열에, 포인터(char *s
)는 읽기 전용 문자열에 적합합니다.
5. 결론
C에서 char s[]
와 char *s
는 메모리 관리와 수정 가능성 측면에서 큰 차이를 보입니다. 이러한 차이를 이해하고 적절히 사용하면 메모리 관련 오류를 줄이고 더 안전한 코드를 작성할 수 있습니다.