잡동사니/GPT가 알려주는

[GPT가 알려주는 C] char[]와 char*

heylo 2025. 4. 4. 11:56
char abc[]랑
char* def 차이가 뭐지?
 

ChatGPT의 말:

char abc[]랑 char* def는 둘 다 **문자열(문자 배열)**을 다루는 데 쓰이지만,

메모리에서 다루는 방식이 달라.

 

핵심은:

✅ char abc[] → 배열 (Array)
✅ char* def → 포인터 (Pointer)

이걸 아주 쉽게 정리해볼게 👇


✅ 차이 요약표

 

    항목                                  char abc[]                             char* def
의미 문자 배열 문자에 대한 포인터
메모리 문자열 자체를 저장 문자열이 있는 **위치(주소)**를 저장
초기화 시 문자열이 복사됨 문자열 주소만 저장됨
수정 가능성 내용 수정 가능 주소가 가리키는 문자열이 상수일 수 있어 수정 불가

📦 예제 1: char abc[] = "hello";

 
 
  • "hello"라는 문자열이 스택 메모리에 복사됨
  • abc는 배열이기 때문에 → 실제 문자들을 자기 공간에 가짐
  • 수정 가능:
  • abc[0] = 'H'; // 가능!

🎯 예제 2: char* def = "hello";

 
 
  • "hello"는 **읽기 전용 메모리(텍스트 영역)**에 저장됨
  • def는 그 문자열의 주소만 갖고 있음
  • 수정 시 위험!
  • def[0] = 'H'; // ❌ 대부분 시스템에서 에러! (Segmentation fault)

💡 언제 뭐 써야 해?

상황추천

 

문자열 내용을 바꿔야 할 때 char 배열 (char abc[])
문자열을 읽기만 할 때 char 포인터 (char* def)
여러 문자열 중 하나만 가리킬 때 char* (ex. char* messages[])

🎁 보너스: 메모리 구조 그림 (텍스트로 표현)

 
char abc[] = "hi"; // 스택 메모리: [ 'h' ][ 'i' ][ '\0' ]
char* def = "hi"; // def -----> [ 'h' ][ 'i' ][ '\0' ] (읽기 전용 메모리)

🔥 진짜 요약 한 줄

char abc[]는 문자들을 복사한 배열,
char* def는 그 문자들이 있는 위치(주소)를 가리키는 포인터

 

 

 

구조체에 문자열 넣을 때 어떤 걸 써야해?

구조체에 문자열을 넣을 때는 목적에 따라 char 배열을 쓸지, char* 포인터를 쓸지 선택해야 해.

 

 

✅ 기본 결론 먼저!

👉 구조체 안에는 보통 char 배열을 사용하는 게 안전해.

 

struct Person { char name[50]; // ✔ 안전하고 독립적인 문자열 저장 };

이렇게 하면 구조체가 자체적으로 문자열 데이터를 갖고 있어서,

  • 복사도 편하고
  • 구조체가 사라져도 메모리 문제가 없고
  • 포인터처럼 주소 잘못 참조할 걱정도 없음

😬 그런데 char*를 쓰면?

struct Person { char* name; // ⚠ 문자열 주소만 저장 (실제 문자열은 다른 곳에 있음) };

이 경우:

  • name이 가리키는 문자열이 다른 곳에 있거나 동적 할당된 거야
  • 잘못하면 구조체가 가리키는 문자열이 날아가거나 메모리 오류 발생할 수 있어
  • 복사도 신경 써야 해 (얕은 복사 문제!)

🔍 비교 요약

항목                                                   char name[50]                                           char* name
메모리 소유 구조체 안에 문자열이 존재 문자열은 다른 곳에 존재
안전성 ✅ 안전 ⚠ 주소 관리 필요
복사 시 동작 내용이 같이 복사됨 포인터만 복사됨 (얕은 복사)
동적 할당 필요? ❌ X ✅ O (필요 시 malloc)

🎯 실전 예제: 배열 vs 포인터

🔸 배열 버전 (추천)

struct Student { char name[20]; };
struct Student s1;
strcpy(s1.name, "Alice"); // OK!

🔸 포인터 버전 (주의 필요)

struct Student { char* name; };
struct Student s1;
s1.name = malloc(20);
strcpy(s1.name, "Alice");

쓰고 나면 반드시 free(s1.name);도 해줘야 해


✅ 정리

목적                                                                                              추천 방식
일반적인 문자열 저장 char name[크기] (배열) ← 이거 써!
문자열을 동적 할당해서 유연하게 처리 char* name + malloc