2013-09-06 3 views
0

강사가 다음 기능을 제공합니다.C & 포인터 추가 문자 배열

char *p8_1 = (char*) malloc(sizeof(char)*11); 
    char *p8_2 = (char*) malloc(sizeof(char)*11); 
    char *p8_3 = (char*) malloc(sizeof(char)*11); 
    p8_1[9] = 'u'; 
    p8_2[2] = p8_1[9]; 
    p8_2[10] = p8_1[9]; 
    p8_3[3] = p8_2[10]; 
    step_step_step(p8_1, p8_2, p8_3); 

을 그리고 그것은 인쇄 오류를 유지 : 그래서 나는 이런 식으로 함수를 호출하려고 롤 모호성에 대한

void step_step_step(char *first, char *second, char *third) 
{ 
    if (third[3] == second[2] + 8 && second[2] == first[1] + 8) 
     printf("8: Illinois\n"); 
    else 
       printf("8: ERROR\n"); 
} 

나를 비난하지 않는다. 여기서 내가 뭘 잘못하고 있니? 나는 내 다른 솔루션 그렇게되면 문제가 해결되지 않는 이유를 이해하지 않습니다

p8_2[2] = p8_1[1] + 8; 
p8_3[3] = p8_2[2] + 8; 
step_step_step(p8_1, p8_2, p8_3); 
+3

이의 우선 순위를 확인'+'와'&&' – verbose

+1

귀하의'+'연산자는 문자가 아닌 포인터를 추가, 그래서 거기에있다 여기에 "포인터 추가"가 없습니다. 대신에 'u'와 'u'+ 8 '을 비교하고 비 동일하게 얻는 것 (놀랍지 않게) –

답변

3

확인하려는 모든 요소가 'u'으로 초기화되었으므로 if 조건이 충족되어야한다고 생각합니다. 코드에서 p8_3[3], p8_2[10], p8_2[2]p8_1[9]에 해당합니다. third로서

step_step_step(p8_1, p8_2, p8_3); 

요소가 괜찮 3의 RD 색인은 p8_3 값을 취하고, 그 값 'u'을 갖는다 : 다음에, 호출이있다. 그러나 second[2]의 값은 'u'이며 그 다음에 == 비교 전에 8이 추가됩니다. 그 결과 ==은 잘못된 평가 결과를 낳습니다. &&은 단락되어 있으며 else 케이스는 if입니다.

단락이 발생하지 않은 경우 &&의 오른쪽 표현은 second[2]first[1] + 8을 비교합니다. first[1]은 초기화되지 않으므로 정의되지 않은 동작이 발생했을 수 있습니다.


인덱싱 연산자 *(ptr + index)ptr[index] 등 행동한다. 확실히 하지*(second + 2 + 8)과 동일하다

*(second + 2) + 8 

: 그래서, 식 :에

second[2] + 8 

은 변환합니다.

+0

그가 무엇을하려고하는지 어떻게 알 수 있습니까? :) 나는 정말로 열심히 노력하고 있고, 실패하고있다. –

+0

이 것들은 분명하지 않습니다 - 그가 왜 두 번째 [10]라고 말하지 않습니까; 어쩌면 그는 'ascii char 8 steps higher'을 의미합니다. 그의 테스트가 그런 식으로 그것을 설정하지 않았지만 – pm100

+0

나는 그가 어떻게 입력을 초기화했는지에 따라 의도 된 결과를 추측하고 있습니다. – jxh

5

가능한 연산자 우선 순위 버그 :

변경하려면 다음 if ((third[3] == second[2] + 8) && (second[2] == first[1] + 8))

The wiki article on 'Order of operations'는 평가 우선 순위에 대한 자세한 내용을 알려줍니다.

눈 깜짝 할 사이에 누군가에게 설명 할 수없는 경우, 어떤 표현식이 평가 될 순서대로 - 순서가 중요하지 않으므로 괄호를 사용하거나 (순서 우선 순위가 없기 때문에) 절이 어떻게 분리되어 있는지 즉시 알 수 있습니다.

편집 :

면밀한 관찰이 날 일이 벌어지고 비린내가 뭔가를 실현합니다. 포인터를 증가시키지 않고 있습니다. 그렇다면 다음과 같이 할 것입니다. if ((third[3] == second[2 + 8]) && (second[2] == first[1 + 8]))

+2

괄호에 선명도가 추가 될 수 있지만 연산자 우선 순위 문제는 없습니다. – jxh

1

p8_1 [1]이 초기화되지 않은 것 같습니다. 당신의 "working"예제에서는 p8_1 [1]에있는 임의의 값을 p8_2 [2]에 할당하여 그 결과가 같습니다. 당신이 포인터 추가 할하려는 경우, 당신은 다른 구문을 사용해야합니다

(pointer + (8*sizeof(char))[<index>]