Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C언어에서 char s[]와 char *s의 차이점 완벽 정리

C 언어에서 문자열을 선언할 때 char s[] 형태의 배열을 사용하기도 하고, char *s 형태의 포인터를 사용하기도 합니다. 그렇다면 이 두 가지 방식은 완전히 동일한 것일까요? 결론부터 말하자면, 두 선언 사이에는 몇 가지 중요한 차이점이 존재합니다.

배열과 포인터의 근본적인 차이

s[]는 배열(array)이고, *s는 포인터(pointer)입니다. 예를 들어 char s[20]char *s로 각각 선언했을 때, sizeof() 연산자를 사용하면 각각 20과 4라는 결과를 얻게 됩니다.

첫 번째 경우가 20이 나오는 이유는 배열이 실제 문자열 데이터 20바이트 전체를 담고 있기 때문입니다. 반면 두 번째 경우가 4로 나오는 것은 포인터 변수 하나의 크기(32비트 시스템 기준)만을 나타내기 때문입니다.

메모리 저장 방식의 차이

메모리 저장 위치에도 차이가 있습니다. 배열로 선언된 문자열은 전체 내용이 스택(stack) 영역에 저장됩니다. 반면 포인터로 선언된 경우에는 포인터 변수 자체만 스택 영역에 저장되고, 실제 문자열 내용은 코드 영역(code section)에 저장됩니다.

문자열 수정 가능 여부

가장 중요한 차이점은 바로 수정 가능 여부입니다. 포인터 방식으로 선언된 문자열은 읽기 전용(read-only)이므로 내용을 변경할 수 없습니다. 반면 배열 방식으로 선언된 문자열은 자유롭게 수정할 수 있습니다.

배열 방식 문자열 수정 예제

#include<stdio.h>
main() {
    char s[] = "Hello World";
    s[6] = 'x'; // 6번째 위치의 문자를 수정 시도
    printf("%s", s);
}

출력 결과

Hello xorld
배열 방식에서는 수정이 성공적으로 이루어졌습니다.

이번에는 포인터 방식으로 선언된 문자열을 수정해 보겠습니다.

포인터 방식 문자열 수정 예제

#include<stdio.h>
main() {
    char *s = "Hello World";
    s[6] = 'x'; // 6번째 위치의 문자를 수정 시도
    printf("%s", s);
}

출력 결과

Segmentation Fault

포인터 방식으로 선언된 문자열을 수정하려고 하면 세그멘테이션 오류(Segmentation Fault)가 발생하며 프로그램이 비정상 종료됩니다. 이는 해당 문자열 리터럴이 읽기 전용 메모리 영역에 저장되어 있기 때문입니다.

정리

char s[]는 스택에 저장되며 수정이 가능하고, char *s는 문자열 리터럴을 가리키는 포인터로 읽기 전용이라는 점을 기억하시기 바랍니다. 문자열을 변경해야 하는 상황이라면 반드시 배열 방식을 사용하는 것이 안전합니다.