char str[7] = "banana";
✔ 여기서 일어나는 일:
- "banana"는 문자열 상수이고, 컴파일 시 읽기 전용 메모리에 저장됩니다.
- 그러나 str[7]이라는 배열이 있으므로, "banana"에 들어 있는 6글자 + \0을 배열에 복사합니다.
- str은 스택(stack) 메모리 위에 존재합니다.
- str[0]부터 str[6]까지 각각 'b', 'a', 'n', 'a', 'n', 'a', '\0'이 복사됩니다.
중요: str은 문자열 상수의 주소가 아니라, 복사된 데이터입니다.
char buf[6];
strcpy(buf, "apple");
✔ 문자열 대입 시 오류:
buf = "apple"; //오류
- 배열 이름(buf)은 주소 상수이기 때문에, 대입 연산(=)으로는 주소를 바꿀 수 없습니다.
- buf는 이미 고정된 메모리 주소를 가지고 있기 때문입니다.
그래서 문자열을 배열에 넣고 싶을 땐 대입이 아닌 복사를 해야 합니다.
✔ strcpy(buf, "apple");
- strcpy(도착지, 출발지) → "apple"에 들어있는 문자를 buf에 하나씩 복사한다는 뜻입니다.
- "apple"은 문자열 상수이므로, 예를 들어 메모리 주소 0x200에 저장되어 있다고 가정합니다.
- buf의 각 칸에 'a', 'p', 'p', 'l', 'e', '\0'이 복사됩니다.
📌 다시 말해:
- "apple"은 읽기 전용이므로 수정 불가
- buf는 스택에 생성된 배열이므로 수정 가능
- strcpy는 "apple"의 내용만 복사하여 buf라는 배열 공간에 옮기는 것입니다
주소 관련 핵심 포인트
✔ 배열 이름 = 첫 번째 원소 주소
- str == &str[0]
- buf == &buf[0]
배열 이름 자체는 배열 시작 주소를 의미합니다. 하지만 주소 상수이므로, 다른 주소를 대입하는 것은 불가능합니다.
요약
char str[7] = "banana"; | 문자열 상수를 배열에 복사 | 배열 공간 생성 후 복사 |
char *p = "apple"; | 문자열 상수의 주소 저장 | 읽기 전용 |
buf = "apple"; | 주소 대입 (오류) | ❌ 불가능 |
strcpy(buf, "apple"); | 내용 복사 | ✅ 가능 |
덧붙이면…
- 문자열은 포인터로 다루면 수정 불가, 배열로 다루면 복사 후 수정 가능
- strcpy()는 복사를 하므로, 복사 대상 배열의 크기 충분히 확보해야 합니다
- C언어에서 문자열은 항상 \0로 끝나기 때문에 str[7], buf[6] 등 정확한 크기 확보 중요
'C' 카테고리의 다른 글
문자열 상수를 const char*에 저장하는 이유 (0) | 2025.06.15 |
---|---|
포인트 배열로 여러개 문자열 처리 (0) | 2025.06.14 |
배열 vs 포인터 : 문자열처리 (0) | 2025.06.14 |
문자열 상수 (0) | 2025.06.14 |
void 포인터 (0) | 2025.06.14 |