150 문자열
char s[100] = "hello";
처럼 일반 배열에 문자열 리터럴을 대입하면,
문자열 리터럴 "hello" 가 한 번 메모리에 만들어지고,
그걸 다시 배열 s 안으로 복사하는 구조인가요?
그렇다면 리터럴 자체와 배열에 복사된 문자열이 둘 다 메모리에 존재하니까
결과적으로 같은 문자열이 이중으로 저장되는 거라고 봐도 되나요?
답변 2
1
안녕하세요? 질문&답변 도우미 durams입니다.
이중으로 저장된다고 이해하기보다는, 실행 파일에서 고정적으로 존재하는 데이터와 런타임에 동적으로 생성되는 데이터의 차이라고 보시는게 적절하겠네요. 문자열 리터럴 "hello"가 존재하는 공간과 배열 s의 초기화가 끝난 후 s의 원소가 존재하는 공간 둘 다 메모리에 따로 존재하는 것은 맞습니다만, 두 공간을 모두 단순히 '메모리'라는 하나의 단어로 표현하는 것은 비약이 될 수 있습니다.
보다 자세히 말씀드리자면, 프로그램 실행 이전에 문자열 리터럴 "hello"는 object file 상에서 ELF (Executable and Linkable Format) 기준으로 .rodata section에 속합니다. 이는 read-only data로, 읽기만 가능한 데이터라는 뜻입니다. 이 데이터는 프로그램을 실행하게 되면 read-only code(text) segment라는 영역의 일부로써 RAM에 올라가게 됩니다.
이후 런타임에 char s[100] = "hello";와 같이 배열을 초기화하면 "hello" 리터럴이 존재하는 주소로부터 값을 읽어와서 s가 가리키는 공간에 복사를 하게됩니다.
간단히 말씀드리자면, "hello" 리터럴은 런타임에 따로 저장을 하는게 아니라 이미 오브젝트 파일에 존재하는 데이터이고, 런타임에 그 데이터를 내가 지정한 변수로 복사해와서 사용하는 것이 되겠네요.
1
말씀하신 효율이 공간적인 효율을 의미하는지 또는 처리에서의 효율을 의미하는지에 따라 달라질 것 같지만, 문자열을 어딘가에 저장하는 것 자체는 큰 부담을 주지 않습니다. 다른 메타데이터 없이 단순히 char타입의 배열에 문자를 하나씩 저장한다고 생각했을 때, NULL문자(\0) 포함 1'000'000개의 문자라고 해도 1MB밖에 되지 않습니다.
중요한 것은 이 데이터를 어떻게 활용할 것인지가 되겠네요. 문자열로 무언가 작업을 할 때 저장된 배열 이외의 메모리를 얼마나 사용하는지, 불필요한 복사를 하지는 않는지, 얼마나 캐시 친화적으로 배열에 접근하는지와 같은 고민을 해보시면 될 것 같습니다. 여러 대학의 알고리듬 수업을 들어보시는 것도 추천드립니다.
또한 하나의 거대한 배열에 전체 내용을 저장하고 나서 사용하는 경우는 사실 많지 않습니다. 엄청 긴 문자열을 만나게 되는 경우는 대부분 파일 입출력 또는 네트워킹으로, 각각 대상 파일 디스크립터와 패킷에 대해 버퍼링의 이점을 최대한 활용하기 위해 한 줄씩 읽으면서 처리(파싱)하는 경우가 많습니다.
0
안녕하세요, 인프런 AI 인턴입니다. luki님.
질문해주신 내용은 C언어에서 문자열 리터럴과 배열 초기화의 메모리 저장 방식에 대한 부분입니다.
char s[100] = "hello";라는 코드 라인을 살펴보면, 문자열 리터럴 “hello”는 컴파일 시점에 메모리의 읽기 전용 영역에 할당됩니다. 그리고 이 리터럴은 초기화 과정에서 배열 s로 복사됩니다. 따라서, “hello”라는 문자열이 읽기 전용 메모리에 존재하고, 그것이 복사된 형태로 배열 s에도 편집 가능하도록 저장되는 구조입니다.
하지만, 실제로 “hello”라는 문자열 리터럴이 중복으로 메모리에 존재하진 않습니다. 대신, 문자열이 포함된 배열로 복사되는 것이지, 원본 리터럴이 별도로 저장되는 것은 아닙니다.
관련하여 더 깊이 이해하고 싶다면, 아래 유사한 질문과 답변들이 도움이 될 수 있습니다:
“문자열의 배열을 통한 선언과 포인터를 이용한 선언의 차이”: 이 질문은 배열로 문자열을 선언하는 방식과 포인터를 이용해 선언하는 방식 간의 차이점에 대해 다루고 있습니다.
“data segment, text segment 관련 질문입니다.”: 여기에서는 문자열 리터럴이 메모리 세그먼트에서 어떻게 관리되는지에 대한 설명을 확인할 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
Export template 안됨
1
65
2
완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.
1
93
3
main 함수에서 왜 int만 선언이 되는걸까요
1
81
2
8비트 2진수 변환시 왜 1을 더해야하나요?
1
81
2
혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?
1
78
1
프로토타입과 함수간의 인자 불일치
1
87
2
12.12 헤더 관련 질문
1
74
2
Visual Studio Community 2026 사용 문의
1
171
2
Q. 15:30, 부호가 있는 8비트 정수 질문
1
73
2
getchar(), putchar()
1
111
3
강의자리ㅛ
1
93
2
비주얼스튜디오코드로 공부해도 상관없나요?
1
127
2
소스파일안에 여러 파일
1
87
2
F5와 F7의 차이
1
90
2
c = TWO * (a+b); 에서 a와 b는?
1
67
2
; 세미콜론을 붙이는 기준에 문의
1
78
1
Step over 기능 문의
1
65
2
2.6 강의 따옴표 출력 규칙 문의
1
87
2
int main 함수 관련 오류 문의
1
76
2
13.4 words[0]
0
73
2
11.7 함수를 구현해 봤습니다.
1
67
2
11.6 직접 strcmp와 strncmp를 구현해 보았습니다.
1
71
2
11.6 my_strcat과 my_strncat을 구현해봤습니다.
1
61
2
11.6 fit_str함수를 구현해 봤습니다.
1
59
2





