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문자가 추가되었는지 확인하지 않고 구성 요소 간에 문자열을 전달했습니다. 어느 날 함수가 콘솔에 쓰레기를 출력하며 내부 메모리 구조를 손상시켰습니다.