프로그래밍C 개발자

C에서 문자열 작업은 어떻게 구현됩니까? 문자 배열과 문자열 포인터의 차이점은 무엇입니까? 문자열 작업 중 오류를 피하려면 어떻게 해야 합니까?

Hintsage AI 어시스턴트로 면접 통과

답변

C 언어에서 문자열은 널 바이트('\0')로 끝나는 문자 배열로 구현됩니다. 문자열 선언의 예:

char str1[] = "hello"; // 6개의 문자로 이루어진 배열: {'h','e','l','l','o','\0'} char *str2 = "hello"; // 문자열 리터럴을 가리키는 포인터
  • 문자 배열: 각 요소에 메모리를 할당하며, 널을 포함합니다. 배열은 수정이 가능합니다(만약 const가 아니라면).
  • 문자열 포인터: 수정할 수 없는 문자열 리터럴(읽기 전용 메모리에 배치됨) 또는 할당된 메모리를 가리킬 수 있습니다.

오류를 피하기 위해:

  • 메모리를 적절히 관리하세요 (malloc, strcpy 사용, 버퍼 크기 확인).
  • 문자열을 수정할 때 문자열 리터럴을 사용하지 마십시오.
  • 모든 문자열이 \0으로 끝나는지 확인하십시오.

문자열을 올바르게 사용하는 예:

char buffer[100]; strcpy(buffer, "test"); // OK, buffer는 수정 가능하며 반드시 '\0'을 포함합니다.

트릭 질문

다음 코드의 실행 결과는 무엇이며 어떤 오류가 발생할 것인가요?

char *str = "hello"; str[0] = 'H'; printf("%s\n", str);

답변: 이 프로그램은 정의되지 않은 동작을 초래하며, 아마도 세그멘테이션 오류(segfault)가 발생할 것입니다. 문자열 리터럴은 읽기 전용 메모리 영역에 위치하므로 문자열 리터럴의 주소에 값을 쓸 수 없습니다.

이 주제에 대한 통찰 부족으로 인한 실제 오류 사례


에피소드 팀은 문자열 배열과 문자열 리터럴 포인터의 개념을 혼동했습니다. 하나의 함수는 char *output = "default";를 받았고 이후 strcpy(output, input);를 실행하여 첫 번째 실행 시 크래시가 발생했으며, 그 이유는 복사가 읽기 전용 메모리로 이루어졌기 때문입니다.


에피소드 네트워크 작업 중 결과가 char *buf = NULL; strcpy(buf, data);를 사용하여 할당된 버퍼에 기록되었으며, 이는 초기화되지 않은 메모리에 기록되어 애플리케이션이 크래시났습니다.


에피소드 로컬라이제이션 패키지에서 팀은 \0 문자가 추가되었는지 확인하지 않고 구성 요소 간에 문자열을 전달했습니다. 어느 날 함수가 콘솔에 쓰레기를 출력하며 내부 메모리 구조를 손상시켰습니다.