Game !
C

[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'와 같이 배열에 있는 값을 변경할 수 있습니다.


결론 --> 문자열 상수를 가리키는 포인터는 그 값을 변경할 수 없다. 대신 문자열 상수로 초기화 한 배열은 사본이 배열에 복사 되므로 변경할 수 있다.

 

 

출처 : https://ingorae.tistory.com/1437