2013-08-20 3 views
3

내 코드에서 어딘가에 뭔가 나쁜 일을하고 있습니다. extrema 변수가 실행될 때 정의되지 않은 동작이 발생하지만 대부분 실행되지 않습니다. 어떤 도움이라도 정말 좋을 것입니다. [*] 연산자보다 우선 함

#include <stdio.h> 

void get_extrema(int quadrant, int **extrema) 
{ 
    if (quadrant == 1) 
    { 
    *(extrema)[0] = 0; 
    *(extrema)[1] = 90; 
    } 
    else if (quadrant == 2) 
    { 
    *(extrema)[0] = -90; 
    *(extrema)[1] = 0; 
    } 
} 

void print(int* arr) 
{ 
     printf("%i",arr[0]); 
     printf(","); 
     printf("%i\n",arr[1]); 
} 

int main(void) 
{ 
    int *extrema = (int*)malloc(2*sizeof(int)); 
    get_extrema(1,&extrema); 
    print(extrema); 
    get_extrema(2,&extrema); 
    print(extrema); 
} 

는 또한 다음과 같이 포인터 연산을 사용하여 극값 배열 편집을 시도 :

**(extrema) = 0; 
**(extrema+1) = 90; 

을하지만 그 중 하나가 작동하지 않았다. 나는 이것이 어디가 잘못 될지 전혀 모른다. 정말로 도움이 될 수있다.

+0

printf ("% s", arr [0]); 용의자입니다. % s는 문자열을 나타냅니다. – Bathsheba

+0

@ Bathsheba 좋은 지적. 그게 내 복사의 실수 였어. – eatonphil

+0

@philaeton ;-) UB 포인트가 적습니다. – Bathsheba

답변

8

정의되지 않은 동작을 얻는 이유는 첨자 연산자 []이 간접 참조 연산자 *보다 우선한다는 것입니다. extrema의 값은 포인터의 배열로 인덱싱됩니다. 포인터가 하나뿐이기 때문에 올바르지 않습니다.

당신이 포인터에 대한 포인터를 전달하고 있기 때문에

, 당신은 괄호 안에 별표를 넣어해야합니다

if (quadrant == 1) 
{ 
    (*extrema)[0] = 0; 
    (*extrema)[1] = 90; 
} 
else if (quadrant == 2) 
{ 
    (*extrema)[0] = -90; 
    (*extrema)[1] = 0; 
} 

Demo on ideone.

+0

완벽한 답변. 정말 고마워요. – eatonphil

1

a[b]*(a + b)에 동일하지만, *보다 더 높은 우선 순위를 가지고 있습니다. (a + bb + a이므로 a[b]b[a]과 동일하고 5[a]a[5]과 동일합니다. 따라서

:

*(extrema)[1] = 90; 

// is equal to 
*(*(extrema + 1)) = 99; 

// When what you want to do is 
*((*extrema) + 1) = 99; 

// which is of course equal to 
(*extrema)[1] = 99; 

그러나, 더 나은 질문 : 그것은 을 필요할 때 왜, 이중 포인터를 사용하고 있습니다.

void get_extrema(int quadrant, int *extrema) 
{ 
    if (quadrant == 1) 
    { 
     extrema[0] = 0; 
     extrema[1] = 90; 
    } 
    else if (quadrant == 2) 
    { 
     extrema[0] = -90; 
     extrema[1] = 0; 
    } 
} 

void print(int *arr) 
{ 
    printf("%i,%i\n", arr[0], arr[1]); 
} 

int main(void) 
{ 
    int *extrema = (int *)malloc(2 * sizeof (int)); 

    get_extrema(1, extrema); 
    print(extrema); 

    get_extrema(2, extrema); 
    print(extrema); 
}