2011-09-11 6 views
1

아래의 프로그램은 내게 오류 (*a)[5]=((*)[])&v;을 제공합니다. 그 줄에 입력하지 않으면 오류가 계속 발생합니다.배열에있는 포인터

int main() 
{ 
    int v[10]; 
    int **p; 
    int (*a)[5]; 
    (*a)[5]=((*)[])&v; 
    printf("%d\n",*a); 
    printf("%d\n",sizeof(v)); 
    return 0; 
} 
+5

당신은 무엇을하고 있다고 생각하니? 무엇이 있어야 하는가? –

+0

무엇이 오류입니까? – tenpn

+6

아, 아프다 ..... –

답변

4

오류가 발생하면 런타임 오류가 발생했을 수 있습니다. int (* a) [5]는 초기화되지 않는 5 개의 int 배열에 대한 포인터입니다. 그러나 다음 줄에서는 역 참조를 시도합니다. 그것을 사용하기 전에 'a'를 초기화해야합니다. v로 초기화하려고 할 수 있지만 5 개의 int 배열이 아닙니다. 만약 v를 int v [5]로 재 선언한다면, a = & v가 작동해야합니다.

+0

아마도 (int (*) [5]) & v를 사용하면 가장 좋은 스타일은 아니지만, v의 크기에 관계없이 작동해야합니다. '. –

5

&v은 int 배열 v에 대한 참조이므로 형식이 int ** (본질적)입니다. int (*a)[5]은 5 개의 int 배열에 대한 포인터를 선언한다는 것을 의미합니다. 그러나 다음 줄에서 (*a)[5]을 쓸 때, a을 참조 해제하여 int 포인터를 얻은 다음 다시 dereferncing하여 [5]에 저장된 요소에 액세스해야 함을 의미합니다. 그러나 C의 배열은 0으로 인덱싱되므로 [0]에서 [4]까지만 액세스 할 수 있으며 [5]은 할당되지 않습니다.

당신은 a = &v을 원합니다. 그러면 a이 int 포인터 v에 대한 포인터가됩니다. *a 그렇게 "%d" 비행하지 않습니다하는 int 포인터처럼 다른 문제가있다, 당신은 등

+0

누구에게 -1'd에게, 왜 그런지에 대해 논평 해 주시겠습니까? 나는 틀린 것을 쓴다고 생각하지 않는다. – BlackJack

+1

: 설명 주셔서 감사합니다. 그러나 & v는 int 배열에 대한 포인터를 제공하며 int에 대한 포인터에 대한 포인터는 제공하지 않습니다. 시도한 경우 p = & v; 컴파일러는 'int (*) [10]'에서 'int **'로 변환 할 수 없다는 오류를 발생시킵니다. – Angus

+0

나는 -1을하지는 못했지만, 여러분의 대답은 포인터가 포인터라는 점에서 몇 가지 점을 말하는 것으로 보입니다. 'int ** '타입이 아닌'int (*) [10]'타입이고'int (*) [10]'타입의 변수로부터의 할당이 놀랍습니다. (*) [5]'는 캐스트없이 작동합니다. –

4

변수 a에 할당 만에 a가 있어야 ((*)[]) 그냥 불필요, a 또는 v에 모든 값을 부여하지 않았습니다 LHS.

2

나는 당신이 [5] INT * 포인터의 배열입니다 *

#include <stdio.h> 

int main() 
{ 
    int v[10]; 
    int **p; 
    int *a[5]; 

    v[0] = 1234; 
    a[0] = v; 

    printf("%d\n", *a[0]); 
    printf("%d\n", sizeof(v)); 

    return 0; 
} 

을 기대하는 것보다 간단하다고 생각합니다. v [10]은 사실 int에 대한 포인터이기도합니다.

그래서 *와 a [0]은 사실 똑같습니다.

예상 소요 시간 : 아마도 printf ("% d \ n", a [0] [0]); 더 좋다

+0

'a [0]'은 가비지 포인터를 역 참조합니다. –

+0

나는 그렇게 생각하지 않는다. – bobc