잡동사니/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 |