C

문자열을 배열로 처리할 때 주의할점

1space 2025. 6. 14. 18:33
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