2013-06-20 3 views
3
#include <stdio.h> 
int myfunc(char *str) 
{ 
    char *ptr =str; 
    while(*ptr++); 
    printf("%s %s\n",str,ptr); 
    return ptr-str-1; 

}  
int main() 
{ 
    printf("%d\n", myfunc("Princess Leia")); 
    return 0; 
} 

출력 :이상한 출력 설명

Princess Leia %d 

13 

어떻게 PTR 그것에 문자열로 %d을 가지고 있습니까? 그리고 ptr-str-113 인 이유는 무엇입니까?

답변

8
while(*ptr++); 

증가 ptr 여전히 때와 ptr 포인트는 0 종결 뒤에 가리 후에 있도록 전달 된 문자열의 0을 종료.

인수로 "Princess Leia"을 사용하면 ptr이 14 번 증가하므로 반환 값은 14 - 1 = 13입니다.

0- 종결 자 (여기에 있음)를 가리킬 때 ptr 역 참조가 일반적으로 정의되지 않은 동작이기 때문에 정의되지 않은 동작은 제쳐두고 인쇄됩니다. 실제로는 전달 된 문자열과 0 바이트 문자 다음에 오는 바이트가 지정됩니다. 터미네이터. 여기 , 형식 문자열 "%d\n" happened to be stored just after "Princess Leia"이후.

+0

@Danial Fischer -이 코드를 4 개의 다른 플랫폼에서 실행하려고했습니다. 거룩한 모세. 그들은 모두 '% d'을 (를) 제공합니다. 이전에 나는 UB가 될 것이라고 생각했지만, 나를 놀라게 한 4 가지 다른 플랫폼에서! –

+1

My gcc (4.7.2, on openSuSE 12.3 64-bit)도'Princess Leia % d'를 생성합니다. 하지만 내 clang (3.2)는'clang leia.c && ./a.out Princess Leia 13''ptr'에 대한 출력을 생성하지 않습니다. 항상 같은 것은 아닙니다. –

+0

나는 gcc 4.3.2와 코드 블록을 시험해 보았다. 그것은 단지 우연일지도 모른다! 답변 해 주셔서 감사합니다. –

3

운이 좋았습니다.

Princess Leia의 종료 널 (null) 뒤에 오는 바이트를 가리키는 ptr으로 끝났습니다. 불합리하지 않다면 정의한 다음 const char을 가리키고 있습니다 (예 : %d\n).

이것은 예측할 수없는 경우에도 정의되지 않은 동작이며 에 의존하지 않습니다.