문자열이란 char 타입의 배열이며, 널 종료 문자(\0)를 포함하는 연속된 문자들의 집합을 말한다.
여기서 말하는 배열이라는 것은 그 본질이 메모리의 어느 공간에 저장되어 있는 것이라고 생각할 수 있다.
배열이라면, 그 값을 당연히 수정할 수 있다.
실제 코드에서도 char[] 에 문자열을 담고 char[0], char[1], ... 로 접근을 해서 배열의 항목을 수정할 수 있다.
그렇다면 문자열 상수는 어떨까?
#include<stdio.h>
int main()
{
const char* str = "Hello World\n";
printf(str); // 1
printf("Hello World\n"); // 2
return 0;
}
위와 같이 str은 문자열 상수로 Hello World 문자열의 주소를 담고 있다.
위와 같은 예제가 있을때 1번 printf에서 중단점을 잡고 디버깅에 진입하고
str이 있는 메모리 주소로 가면 위 그림처럼 Hello World가 저장되어 있는 것을 볼 수 있다.
만약 메모리에서 Hello World값을 수정하고 2번 printf에서 Hello World를 출력하면 어떤 값이 출력될까?
이처럼 2번째 printf에서 TESTING_rld로 바뀐것을 확인할 수 있다.
정리해보면 다음과 같다.
1. str이 가리키고 있는 문자열과 2번 printf에서 출력하는 Hello World는 같은 주소다.
2. 문자열 상수라고 하더라도 그 본질은 배열이고 배열이라면 메모리에 연속된자리에 문자들이
저장되어 있는 것이기 때문에 메모리의 값을 수정하면 해당 값이 수정되는 것을 확인할 수 있다.
'CS' 카테고리의 다른 글
[CS] 스택과 힙 (0) | 2025.04.09 |
---|---|
[CS] 메모리 보호 기법 ( ASLR ) (0) | 2025.03.11 |
[CS] 빅 엔디안, 리틀 엔디안 (0) | 2025.02.23 |
[CS] sleep 함수 (0) | 2025.02.11 |
[CS] 디스패처( Dispatcher ) (0) | 2025.02.11 |