2016-12-15 5 views
0

오케이 그럼 memcpy로 strcat 함수의 구현을 보았습니다. 나는 할당 할 필요가 없으므로 효율적이라는 것을 알고 있습니다. 그러나 소스 문자열의 내용을 결과 문자열로 덮어 쓰는 방법은 어떻게 유지합니까? 예를 들어strcat와 memcpy의 혼동

는 테이크를 할 수 있습니다 :

char *str1 = "Hello"; 
char *str2 = "World"; 

str1 = strcat(str1, str2); 

어떻게 str2에서 그이 결과이 "Helloworld"문자열의 내용으로 덮어 쓰기되지 않도록합니까?

문자열이 문자 배열에 불과하고 배열의 크기가 고정되어 있고 배열을 다시 할당하지 않으면 배열보다 큰 배열에 바이트를 복사하면 안전하지 않습니까?

+0

겹침 때문에 UB를 호출했을 경우 * strcat가 작동하는 방식을 이해한다고 가정 할 때 * 실제로 생각한 것 *이 될 가능성이 더 큽니다. 메모리 할당). – WhozCraig

+0

포인터가 무엇인지 아십니까?String Literar가 무엇인지 알고 있습니까? – Michi

+0

[코드 검토] (http://codereview.stackexchange.com/questions/149812/strcat-implementation)에서'strcat()'구현에 관한 질문이있었습니다. OP는'malloc()'을 사용했기 때문에 표준 라이브러리 접근법에 대한 논의가있었습니다. –

답변

1

아니요 아니요, undefined behavior입니다. 당신은 본질적으로 UB를 호출하는 문자열 리터럴을 수정하려는 모든

첫째,. man page (강조 광산)

strcat() 함수 은 널 종료 바이트를 dest 문자열을 src 문자열 덮어 추가 인용 목적지 버퍼의 사이즈에 관한 둘째

,, ('\0')의 끝에 0,을 입력 한 다음 종료 null 바이트를 추가합니다. 문자열은 겹치지 않을 수 있습니다. dest 문자열에는 결과에 충분한 공간이 있어야합니다. dest이 충분히 크지 않으면 프로그램 동작을 예측할 수 없습니다. [...]

+0

그래, memcpy가 정의되지 않은 동작을하는 이유는 무엇일까? 왜 그냥 malloc으로 새로운 배열을 할당하고 거기에 memcpy를 사용하지 않는가? –

+1

@ ng.newbie는'strcpy'가 어떻게 작동하도록 설계되지 않았는지를 보여줍니다. 그게 당신이 원하는 (동적 할당, 두 개의 버퍼 복사본, 그리고 언젠가는'자유로운'호출), 위대하지만, 그것은'strcpy'가 어떻게 설계되었는지가 아니기 때문에 충격적이지 않습니다. 그렇게 행동하지 않습니다. 함수를 잘못 사용하면 정의되지 않은 동작 만 발생합니다. 그것은 기능의 결함이 아닙니다. 그것은 그것을 사용하는 엔지니어의 결함입니다. – WhozCraig

1

내가 거기에 필요가 할당되지하기 때문에이 효율적임을 이해합니다.

잘못된 이해입니다. memcpy도 아니고 strcat도 메모리를 할당하지 않습니다. 둘 다 유효한 메모리 양을 가리키는 포인터를 전달해야합니다. 그렇지 않은 경우, 프로그램은 정의되지 않은 동작을합니다.

귀하의 게시 된 코드는 이유 중 몇 가지에 대한 정의되지 않은 동작이 적용됩니다 프로그램의 읽기 전용 부분에 문자열 리터럴에

  1. str1 점.

  2. str1 문자열이 "HelloWorld"이고 종료 널 문자가 들어있을만큼 메모리가 충분하지 않습니다.

+0

그리고'str1' 포인트는 어쨌든 문자열 리터럴입니다. –

+0

@SouravGhosh, 네, 그 역시. –