인프런 커뮤니티 질문&답변
150 문자열
해결된 질문
작성
·
32
1
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" 리터럴은 런타임에 따로 저장을 하는게 아니라 이미 오브젝트 파일에 존재하는 데이터이고, 런타임에 그 데이터를 내가 지정한 변수로 복사해와서 사용하는 것이 되겠네요.
말씀하신 효율이 공간적인 효율을 의미하는지 또는 처리에서의 효율을 의미하는지에 따라 달라질 것 같지만, 문자열을 어딘가에 저장하는 것 자체는 큰 부담을 주지 않습니다. 다른 메타데이터 없이 단순히 char타입의 배열에 문자를 하나씩 저장한다고 생각했을 때, NULL문자(\0) 포함 1'000'000개의 문자라고 해도 1MB밖에 되지 않습니다.
중요한 것은 이 데이터를 어떻게 활용할 것인지가 되겠네요. 문자열로 무언가 작업을 할 때 저장된 배열 이외의 메모리를 얼마나 사용하는지, 불필요한 복사를 하지는 않는지, 얼마나 캐시 친화적으로 배열에 접근하는지와 같은 고민을 해보시면 될 것 같습니다. 여러 대학의 알고리듬 수업을 들어보시는 것도 추천드립니다.
또한 하나의 거대한 배열에 전체 내용을 저장하고 나서 사용하는 경우는 사실 많지 않습니다. 엄청 긴 문자열을 만나게 되는 경우는 대부분 파일 입출력 또는 네트워킹으로, 각각 대상 파일 디스크립터와 패킷에 대해 버퍼링의 이점을 최대한 활용하기 위해 한 줄씩 읽으면서 처리(파싱)하는 경우가 많습니다.
0
안녕하세요, 인프런 AI 인턴입니다. luki님.
질문해주신 내용은 C언어에서 문자열 리터럴과 배열 초기화의 메모리 저장 방식에 대한 부분입니다.
char s[100] = "hello";라는 코드 라인을 살펴보면, 문자열 리터럴 “hello”는 컴파일 시점에 메모리의 읽기 전용 영역에 할당됩니다. 그리고 이 리터럴은 초기화 과정에서 배열 s로 복사됩니다. 따라서, “hello”라는 문자열이 읽기 전용 메모리에 존재하고, 그것이 복사된 형태로 배열 s에도 편집 가능하도록 저장되는 구조입니다.
하지만, 실제로 “hello”라는 문자열 리터럴이 중복으로 메모리에 존재하진 않습니다. 대신, 문자열이 포함된 배열로 복사되는 것이지, 원본 리터럴이 별도로 저장되는 것은 아닙니다.
관련하여 더 깊이 이해하고 싶다면, 아래 유사한 질문과 답변들이 도움이 될 수 있습니다:
“문자열의 배열을 통한 선언과 포인터를 이용한 선언의 차이”: 이 질문은 배열로 문자열을 선언하는 방식과 포인터를 이용해 선언하는 방식 간의 차이점에 대해 다루고 있습니다.
“data segment, text segment 관련 질문입니다.”: 여기에서는 문자열 리터럴이 메모리 세그먼트에서 어떻게 관리되는지에 대한 설명을 확인할 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.






그럼 엄청 긴 문자열을 배열에 저장하는건 비효율적일까요?