[C/C++] C에서 char s[]와 char *s의 차이와 메모리 동작 원리

[C/C++] C에서 char s[]와 char *s의 차이와 메모리 동작 원리

C
민호이 민호이 2025. 1. 15. 02:38
목차
  1. 1. 문제 개요
  2. 2. char s[]와 char *s의 차이점
  3. 2.1 char s[]의 동작 원리
  4. 2.2 char *s의 동작 원리
  5. 3. 사용 사례 및 주의사항
  6. 3.1 char s[]를 사용할 때
  7. 3.2 char *s를 사용할 때
  8. 4. 핵심 요약
  9. 5. 결론

1. 문제 개요

C 언어에서 문자열을 선언할 때 두 가지 주요 방식이 있습니다:

char s[] = "hello";
char *s = "hello";

이 두 방식은 비슷해 보이지만, 메모리 배치와 수정 가능성에서 중요한 차이를 보입니다. 이를 명확히 이해하면 메모리 관련 오류를 방지하고 더 안전한 코드를 작성할 수 있습니다.


2. char s[]와 char *s의 차이점

2.1 char s[]의 동작 원리

  • 문자열 복사: "hello" 문자열은 읽기 전용 메모리에 저장되고, 배열 s는 해당 문자열을 복사하여 스택 메모리에 저장합니다.
  • 수정 가능: 배열 s는 복사된 데이터이므로 수정 가능합니다.
char s[] = "hello";
s[0] = 'H'; // 정상적으로 작동
  • 메모리 배치:
    • 읽기 전용 메모리에 "hello"가 저장됨.
    • 스택 메모리에 복사된 "hello"가 저장됨.

2.2 char *s의 동작 원리

  • 문자열 포인터: "hello" 문자열은 읽기 전용 메모리에 저장되고, 포인터 s는 해당 문자열의 시작 주소를 가리킵니다.
  • 수정 불가능: 읽기 전용 메모리를 가리키므로 문자열을 수정하려고 하면 정의되지 않은 동작이 발생합니다.
char *s = "hello";
s[0] = 'H'; // 런타임 오류 또는 세그멘테이션 오류 발생
  • 메모리 배치:
    • 읽기 전용 메모리에 "hello"가 저장됨.
    • s는 이 문자열의 주소를 가리킴.

3. 사용 사례 및 주의사항

3.1 char s[]를 사용할 때

  • 문자열이 수정되어야 할 경우 적합합니다.
  • 배열 크기가 고정되므로 문자열 크기를 초과한 값을 저장하려고 하면 버퍼 오버플로우 문제가 발생할 수 있습니다.
char s[] = "hello";
strcpy(s, "world"); // 정상 작동 (문자열 크기가 배열 크기를 초과하지 않을 경우)

3.2 char *s를 사용할 때

  • 문자열이 수정될 필요가 없고, 읽기 전용 문자열을 가리키기만 할 때 적합합니다.
  • 포인터가 다른 문자열을 가리키도록 변경할 수 있습니다.
char *s = "hello";
s = "world"; // 정상 작동 (포인터가 새로운 문자열을 가리킴)

4. 핵심 요약

  • char s[]: 문자열을 읽기 전용 메모리에서 복사해 스택에 저장하며, 수정 가능합니다.
  • char *s: 문자열의 읽기 전용 메모리 주소를 가리키며, 수정이 불가능합니다.
  • 배열(char s[])은 주로 수정 가능한 문자열에, 포인터(char *s)는 읽기 전용 문자열에 적합합니다.

5. 결론

C에서 char s[]와 char *s는 메모리 관리와 수정 가능성 측면에서 큰 차이를 보입니다. 이러한 차이를 이해하고 적절히 사용하면 메모리 관련 오류를 줄이고 더 안전한 코드를 작성할 수 있습니다.

 

저작자표시 비영리 변경금지 (새창열림)
  1. 1. 문제 개요
  2. 2. char s[]와 char *s의 차이점
  3. 2.1 char s[]의 동작 원리
  4. 2.2 char *s의 동작 원리
  5. 3. 사용 사례 및 주의사항
  6. 3.1 char s[]를 사용할 때
  7. 3.2 char *s를 사용할 때
  8. 4. 핵심 요약
  9. 5. 결론
'C' 카테고리의 다른 글
  • [C/C++] 문자열 리터럴은 어디에 저장될까? 메모리와 연관해서 알아보자!
  • [C/C++] C 언어에서 malloc() 결과 형변환, 정말 필요할까?
  • [C/C++] 전역변수와 장단점 자세히 살펴보기: 좋은 코딩
  • [C/C++] 함수 사용법과 예제: 선언부터 고급 활용까지
민호이
민호이
민호이
ChungCODE
민호이
전체
오늘
어제
  • Categories (128)
    • 스포츠 (6)
    • 인공지능 (5)
    • 주식 (6)
      • 경제 주식 전망 (5)
      • ETF (9)
    • CSAPP (4)
      • Lab Session (4)
      • Concepts (0)
    • C (19)
    • Java (24)
    • Rust (44)
      • Concepts (27)
      • Libraries (17)
    • PS (2)
    • 국내 소식 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 수학
  • 최소공배수
  • c++
  • 최대공약수
  • 코드업
  • 유클리드 호제법
  • C
  • 알고리즘

최근 댓글

최근 글

반응형
hELLO · Designed By 정상우.v4.2.1
민호이
[C/C++] C에서 char s[]와 char *s의 차이와 메모리 동작 원리
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.