2012-04-25 3 views
0

나는 C 언어에 익숙하며, 아래 두 코드 조각 코드의 차이점을 알고 싶습니다. 첫 번째 코드를 실행하면 처음에는 제대로 작동하지만 두 번째 코드에서는 세분화 오류가 발생합니다 이 행동에 대한 이유는 무엇입니까?C에서 Dereferencing 문자열 포인터

 printf("%c\n",*strptr++); 

     printf("%c\n",*(strptr+i)); 

다음 코드는 다음과 같습니다.

#include<stdio.h> 

int main(void) 
{ 
     char str[100]="My name is Vutukuri"; 
     int i=0; 
     char *strptr; 

     strptr=str; 

     while(*strptr != '\0') 
     { 
       printf("%c\n",*strptr++); 
       //printf("%c\n",*(strptr+i)); 
       //i++; 
     } 
     return 0; 
} 
+10

'i'의 값은 무엇입니까? – geekosaur

+5

@geekosaur : i = sqrt (-1) –

+1

* i-roll * 모두가 만화를 사용합니다 ... – geekosaur

답변

3

완전히 다릅니다.

첫 번째 코드는 strptr에 문자를 인쇄 한 다음 strptr을 1 씩 증가시킵니다.

두 번째 코드는 strptr + i에 문자를 인쇄합니다.

+1

실제로 'strptr'에서 문자를 _first_ 인쇄하지 않고 한 문자 씩 증가시키고 실제로 하나씩 증가시키고 _then_는 이전 위치에서 문자를 인쇄합니다 _trololo_ –

+0

@ 세 카네기 : 어떻게 오셨습니까? 그게 바로 후임금이라고 확신합니다. – orlp

+0

함수가 호출되기 전에 증분이 수행되고 이전 값이 함수로 전송됩니다. 나는 니가 그곳에있는 말에서 니트를 뽑는 것만으로 난리 쳤다. 제 의견은 우리가 알기에 모름이라고 말하면서 잘못되었으며, 그 행동은 잘 정의되어 있습니다. –

1

은 아마 당신은 먼저 초기 값을 사용하여 1

  • ++ 연산자 난을 교체하려면, 다음 그것을 증가시킵니다.
  • + 연산자가 새 값을 계산 한 다음 사용합니다.
+0

두 개의 스 니펫을 차례대로 실행하지 않는 한 ... 첫 번째 행의 동작을 복제하려면 'i'가 0이어야합니다. –

+0

예, 물론 :) – gabitzish

+0

"아마도 i를 1로 바꾸고 싶을 것입니다."- OP가 원했을 가능성은 거의 없습니다. OTOH에서 * foo ++ 또는 foo [i] (* (foo + i)와 동일)의 루프는 서로 바꿔 쓸 수 있습니다. 여기서 문제는 분명히 i의 가치이지만, 설명 할 수없는 이유에 대한 OP는 그 맥락을 생략했다. –

2

분명히 주소 strptr은 할당 된 장소를 메모리에 참조하는 반면, strptr + i은 할당되지 않은 장소를 가리 킵니다. 당신은

char s[LENGTH]; 

또는 다음

char* s = (char*)malloc(LENGTH * sizeof(char)); 

당신은 s[LENGTH - 1]s[0]에서 문자를 사용할 수있는 문자열을 할당 (및 문자열 자체에만 LENGTH - 1 길 수 있으므로 장소는 널 위해가있는 경우 터미네이터). 귀하의 경우, strptr + i 포인터는 아마도 s...s + LENGTH - 1 범위에 없습니다.

+0

아, 지능적이고 유용한 반응 ... 그리고 OP가 심지어 그가 0에서 n으로 반복하고 있다고 언급하기 전에. –