2011-05-07 4 views
0
main() 
{ 
    char *x="girl"; 
    int n,i; 
    n=strlen(x); 
    *x=x[n]; 
    for(i=0;i<n;i++) 
    { 
    printf("%s \n",x); 
    x++; 
    } 
} 

출력은 무엇입니까?
출력을 설명해주십시오 .......................
O/P는 다음과 같습니다C, 포인터, 문자열

irl 
rl 
l 
+2

결과 = UB = 정의되지 않음 Behavio (u) r –

+0

'char * x'를'char x []'로 변경하여 정의되지 않은 동작을 피하십시오. – hugomg

+0

@missingno : 코드에 더 많은 UB 문제가 있습니다. 문자열 리터럴을 수정하는 것은 혼자가 아닙니다. – pmg

답변

1

다른 사람들이 지적했듯이, 작성된 프로그램에는 정의되지 않은 동작이 있습니다. 당신은 작은 변경을 한 경우

:

char x[] = "girl"; 

는 나는 설명 할 법적, 가능한 믿습니다. (편집 :. 당신이 printf을 사용하고 있기 때문에 실제로 문제 그것은 int main() 아직 거기, 당신은 strlen을 사용하고 있기 때문에 당신은 return 0; 끝에 당신은 또한 #include <string.h> 필요해야하고, #include <stdio.h>..)

라인

x[4]
*x = x[n]; 

세트 (즉 *x) x[0] (일 '\0' 문자열 종료 될 수 있습니다). 따라서 첫 번째 문자는 문자열 종결 자이므로 인쇄 할 첫 번째 문자열은 빈 문자열입니다. 하위 문자열을 인쇄 문자열을 통해

우리는 다음 루프, 한 번에 하나 개의 문자 : 결과는 정의되지 않은 동작이

irl 
rl 
l 
+0

감사합니다 ... – Adi

4

출력은 정의되지 않은 동작입니다. 문자열 리터럴을 수정했습니다.

+0

:) ..... ok char * x = "hello"; – Adi

+0

... 범위에 프로토 타입이없는 가변 인수 함수를 호출했습니다. 'main'에서 값을 반환하지 않았습니다. C99는 암시적인'int'를 금지하기 때문에 코드는 C99이 아닙니다. – pmg

+1

@ Adi : 문자열의 단어 만 변경했습니다. 그것은 UB를 변화시키지 않습니다. –

1

동안 DeadMG 말했듯이,의 당신이 char x[] = "girl"로 X를 선언 가정하자.

당신은 (단어 "여자"의 길이가 4 이후), 당신은 (x[0] 인) *xx[4]의 값을 할당하지만,이 값이 '\ 0'(null 종결) n 4를 할당

이제 x에서 다음 널 종결 자로 단어를 반복하여 인쇄하지만 처음에는 첫 번째 문자가 널 종결자가되므로 아무 것도 얻지 못합니다. 그 후에 색인을 증가시키는 단어를 인쇄합니다.

g i r l \0 

*x = x[4]: 

\0 i r l \0 
^ ^^^
it1 it2 it3 it4  // << Where does x points to in each iteration of the for loop 
0

코드가 현저하게 의심됩니다. *x=x[n] 리터럴 "소녀"를 덮어 쓰려고 시도하면 플랫폼과 컴파일러에 따라 효과가 달라질 수 있습니다. 더 정확하게 다음과 같이 선언해야합니다 :

const char *x = "girl"; 

그런 다음 컴파일하지 않아야합니다.

+0

더 정확하게 그는 문자열을 수정하는 것이 안전해야하며 컴파일러가 검사 한 문자열의 원래의 비 - 가변성을 만들어 전체 프로그램을 중단시키지 않아야합니다. –

+0

응? 컴파일하지 않는 코드를 작성하는 것이 더 정확합니까? –

+0

@ 사이먼 (Simon) : 문자열 리터럴을 수정하는 것을 허용하지 않는다는 점에서 "더 정확한"것입니다. IOW, 컴파일러는 그와 같은 종류의 오류를 잡아낼 것입니다. –