2013-09-22 2 views
2

저는 초보자이며 아래 예제를 사용하여 배열에 대한 포인터의 개념을 이해하려고합니다. 루프의 종료 조건은 누구에게 말해 줄 수 있습니까?
while 루프가 영원히 계속 실행되고 있지만 출력없이 프로그램이 종료됩니다.
감사합니다. ptrNULL 될 때까지구조체 배열에 대한 포인터를 사용하는 C의 루프 제어

typedef struct abc{ 
    int a; 
    char b; 
} ABC; 

ABC *ptr, arr[10]; 

int main() 
{ 
    ptr = &arr[0]; 
    int i; 
    for(i = 0; i < 10; i++){ 
     arr[i].a = i; 
    } 
    while(ptr!=NULL){ 
     printf("%d \n", ptr->a); 
     ptr++; //Can I use ptr = ptr + n to skip n elements for some n? 
    } 
} 
+1

무한 루프가있는 경우 프로그램이 어떻게 종료됩니까? –

+0

ptr! = NULL이 작동하지 않습니다. 이 작품을 만드는 방법? 루프 종료 상태가 무엇인지 확실하지 않습니다. – codepk

+0

포인터가 오버플로되었을 때 0으로 루프백하지 않는 한 포인터가 증가하지 않습니다. – kenny

답변

2
while(ptr!=NULL){ 

이 실행됩니다. 배열의 첫 번째 요소를 가리키며 항상 증가하므로 다른 구현 세부 사항을 알 수 없으므로 NULL이 될 수도 있고 그렇지 않을 수도 있습니다. 그것은 배열의 끝을 지나서 걷는 것을 확인하는 방법이 아닙니다. 대신

while (ptr < arr + 10) 

이 필요합니다.

ptr = ptr + n을 사용하여 일부 n에 대해 n 개의 요소를 건너 뛸 수 있습니까?

물론. 그리고 우리가 그것에있는 동안 : 왜 안 ptr += n?

0

루프가 무한하지 않으며 ptr == 0 일 때 중지됩니다. 32 비트 컴퓨터를 사용한다고 가정하면 ptr은 32 비트입니다. 0에서 4294967296-1 (0-2^32-1)까지의 숫자를 보유 할 수 있습니다. 루프를 통과 할 때마다 ptr에 8이 추가됩니다. 결국 ptr은 4294967296-8이됩니다. 그것 추가 8 4294967296 결과 - 그러나 실제 결과는 0

주 그래서 그 오버 플로우입니다 :이 단지 작품을 PTR은 4 오프셋 8 의 배수에 그것을 시작하는 일이 될 것입니다 경우 무한 루프.

"% d"에서 "% x"(으)로 변경하십시오. 숫자를 16 진수로 인쇄하면 더 명확 해집니다.

관련 문제