[C] 문자열 상수2022. 10. 23. 17:15
char *test = "abcdef"; 와
char test[] = "abcdef";의 차이점
두 가지의 차이를 이야기 하기에 앞서서 "abcdef"에 대해 짚고 넘어갑시다.
"abcdef"란 코드는 컴퓨터가 프로그램을 메모리에 로드할 때 읽기 전용 메모리에 로드되는 문자열 상수입니다.
문자열 상수의 주소란 말이죠.
참고로 읽기 전용 메모리에는 프로그램 코드 라던가 상수가 로드 됩니다.
그럼 돌아와서 문자열 상수 주소를 char *test인 포인터에 넣느냐 아니면 char test[]인 배열에 넣느냐가 차이점 이군요. 둘의 차이는 다음과 같습니다.
1. char *test = "abcdef"; - 포인터에 문자열 상수를 할당합니다.
따라서 문자열을 참조 할 수는 있지만 값을 바꾸지는 못합니다.
문자열이 저장된 메모리가 읽기 전용 메모리 라서 그렇습니다.
즉 test[2] = 'x'; 구문 처럼 쓰면 에러가 발생합니다. test 변수가 가리키는 문자열이 읽기전용이기 때문입니다.
2. char test[] = "abcdef"; - 문자 배열을 문자열 상수의 크기 만큼 스택에 할당하고 그 내용도 동일하게 복사합니다.
메모리 상에는 2개의 "abcdef"가 있게되겠군요.
하나는 읽기 전용 메모리에~ 다른 하나는 스택에~ 이제 test[2] = 'x'와 같이 배열에 있는 값을 변경할 수 있습니다.
결론 --> 문자열 상수를 가리키는 포인터는 그 값을 변경할 수 없다. 대신 문자열 상수로 초기화 한 배열은 사본이 배열에 복사 되므로 변경할 수 있다.
'Language > C++' 카테고리의 다른 글
[C++] C++ 스타일 파일입출력 (0) | 2022.11.12 |
---|---|
[C] C 스타일 파일입출력 (0) | 2022.11.12 |
[C++] 코드 위치나 정보를 받아오는 매크로 들 (0) | 2022.05.08 |
[C++] 함수 포인터 (0) | 2022.05.06 |
[C++] 문법 - 범위 지정 연산자 (0) | 2022.04.01 |