인프런 커뮤니티 질문&답변

최종원님의 프로필 이미지
최종원

작성한 질문수

독하게 시작하는 C 프로그래밍

[필수 실습 문제] MyStrcpy() 함수 작성하기

문자(배)열 복사하는 함수 만들기

해결된 질문

작성

·

243

·

수정됨

0

질문드립니다.

1.size_t를 하시는 이유는 nsiez처럼 예외처리를 위해서 표시하는 건가요?

  1. 문제에서 첫번째 매개변수의 메모리 크기가 되도록 구현하기 위해서 사용하는 건가요?

  2. 해당 for문만(strlen 사용 없이)위에 작성하더라도 구현은 되는 것으로 처음에 작성했습니다. 그렇게 해도 Deepcopy에는 어긋나는게 없는지 궁금합니다.

  3. 만약 위 사진과 같이 return을 하면 지역 변수 주소 반환 오류에 해당하나요?

 

  1. 여기서 szBufferDst는 주소상수 즉 &szBufferDst[0]이 기준요소 이므로 위에 함수에서 포인터를 붙여서 사용하는 건가요? 약 반나절 동안 고민해서 풀어봤습니다만 속이 시원하게 풀리지 않네요 ㅠㅠ 

제가 이해를 잘한건지 궁금해서 오늘은 질문이 조금 많습니다. 양해부탁드려요.🤓

답변 2

1

안녕하세요, 인프런 AI 인턴입니다.

질문에 답변드리겠습니다.

  1. size_t는 데이터의 크기를 저장하기 위한 부호 없는 정수 유형입니다. size_t는 메모리의 크기를 나타낼 때, 표준적으로 사용되며, 배열 같은 경우 그 길이를 표현할 때 흔히 사용되죠. 따라서 size_tnSize의 자료형으로 사용될 때, 크기 계산 및 예외처리를 위한 안전한 표현 방법을 제공합니다.

  2. 문자열 복사 함수는 일반적으로 소스 문자열의 길이를 검사하여 목적지 배열의 크기를 초과하지 않도록 복사합니다. 그러나 strlen 없이 for문을 사용해도 복사 자체는 될 수 있지만, nSize를 넘어가는 복사 시도는 버퍼 오버런 위험이 있으므로 적절한 경계 검사가 필요합니다.

  3. 만약 함수 내부에서 지역 변수의 주소를 반환한다면, 그 지역 변수는 함수 호출이 끝날 때 스택에서 사라지기 때문에 이후에는 더 이상 유효하지 않은 메모리 주소가 됩니다. 함수에서 반환할 때는 보통 동적 할당된 메모리의 주소나 입력 인자로 받은 버퍼의 주소를 반환하는 것이 안전합니다.

  4. szBufferDst는 배열 이름이고, C에서 배열 이름은 배열의 첫 번째 요소를 가리키는 포인터로 해석되므로 MyStrcpy 함수에 전달할 때 &szBufferDst[0]과 동일하게 사용됩니다. 이 경우 szBufferDst를 그대로 사용하여 첫 번째 요소의 주소를 전달하는 것입니다.

질문해 주셔서 감사하며, C언어에서 안전한 문자열 복사와 관련된 이해가 좀 더 명확해지기를 바랍니다. 🤓

최종원님의 프로필 이미지
최종원
질문자

감사합니다 ㅎㅎ

0

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

  1. 네, 예외처리가 목적입니다. 매개변수 nsize는 pszDst가 가리키는 메모리의 크기를 의미합니다. 주석처리된 코드를 보면 pszSrc의 크기를 알아낸 후 그 길이 만큼 pszData에 복사하는 구조임을 알 수 있습니다. 그런데 문제는 대상 메모리 크기가 너무 작을 수 있다는 것입니다. 이런 경우 경계를 넘겨 쓰기가 발생 할 수 있으며 경우에 따라 심각한 보안 오류로 발전할 수 있습니다. 이런 문제를 막기 위해 대상 메모리의 크기를 함께 매개변수로 받는 것입니다.

  2. 네, 맞습니다.

  3. 구현이 되긴 하겠습니다. 그러나 반대로 대상 메모리 크기가 12바이트이고 원본이 5바이트라면 7바이트만큼 더 복사하게 됩니다. 아마도 쓰레기 값이 복사될 것이므로 오류가 발생할 것입니다. Deep copy가 될 수는 있겠지만 적절한 복사라 할 수는 없겠습니다.

  4. 아니오. 포인터 변수가 가리키는 대상을 반환하므로 지역변수 주소 반환이 아닙니다. 참고하시기 바랍니다.

최종원님의 프로필 이미지
최종원

작성한 질문수

질문하기