2012-02-24 5 views

답변

4

이 함수의 두 번째 매개 변수는 const char *입니다. int을 전달 중입니다.

char *strcat(char *restrict s1, const char *restrict s2); 

당신은 기본적으로 포인터로 \0을 역 참조로 strcat를 속여 것 - 그것은 NULL를 역 참조.

+0

빠른 답변을 제공해 주셔서 감사합니다. –

1

strcat의 두 번째 인수는 포인터 인 null 끝 문자 배열이어야합니다. 코드를 컴파일하지 않아야합니다. 그렇다면 결과는 입니다. 정의되지 않은 동작은입니다. 의 끝을 찾을

strcat() 이후의 요구를 : 주석이 (생략있어 일부 실제 초기화를위한 장소 홀더 역할을 반대로) 다음 줄을 설명하기위한 것입니다 경우

+0

고맙습니다. –

+0

'\ 0''은 널 포인터 상수 인'0'입니다. 그래서 호출은'strcat (var, NULL);'입니다. 잘못되었지만 유효합니다. 'strcat'가 널 포인터를 검사하지 않고 그것들을 적절히 다루지 않는 경우에만 (즉, 실제로는 UB가 될 것입니다) 정의되지 않은 동작입니다. –

+0

@DanielFischer : 아 맞습니다. 좋은 지적입니다. 이 경우 0으로 유지되기 때문에 유효합니다. –

0

, 두 번째 시나리오있다 연결을 시작할 위치를 파악하기 위해 첫 번째 인수를 사용하고 초기화되지 않은 문자 배열을 전달하면 첫 번째 문자열의 종료 문자를 찾는 동안 유효한 메모리 외부로 들어갈 수 있습니다. 유효한 메모리 외부를 읽으면 일부 플랫폼에서 충돌이 발생할 수 있습니다.

따라서 두 번째 인수는 중단되는 이유와 아무 관련이 없습니다. 물론 물론 잘못된 것입니다.

+0

char var [9]; /* 일부 초기화 var * / –

관련 문제