2012-12-02 3 views
0

void*에서 캐스팅하는 방법은 무엇입니까? 다차원으로 다시 캐스팅하는 방법은 무엇입니까?

int *a[13][12]; 
void *b 
int *c[13][12]; 

b = (void*) a; 
c = (?????) b; 

c = (int *[13][12])b; 

cast specifies array type

c = (int *[][])b; 

array type has incomplete element type을 말한다 말한다.

컴파일러는하지 assign to an array을 할 수있는, C에서 gcc (Ubuntu/Linaro 4.6.1)

+0

'INT 캐스트없이 모두 같은 (2 희미한) 배열에 대한 포인터를 사용할 수 있습니다 ? – cegfault

+0

c는 포인터가 아닌 배열입니다. c를 int로 선언하면 일반 캐스팅이 작동합니다. – Arjor

+0

@cegfault : "배열 타입 'int * [13] [12]'을 할당 할 수 없습니다."int *** "에 대해 – Douglas

답변

2

, 그래서 C가의 int에 대한 포인터의 배열의 배열로 선언되어 있기 때문에, 당신은 직접 할당 할 수 없습니다.

그러나 for 루프 내에서 차례로 c [i] [j]를 지정하여 모든 항목을 덮어 쓸 수 있습니다.

+0

'c'는 배열이 아니며,'c'는 2d 배열을 가리키는 포인터입니다. 나는 그것이 그렇게 원했지만. 틀렸어? – Dims

+2

@Dims :'c'는 2D 배열에 대한 포인터가 아닌 포인터의 2D 배열입니다. – netcoder

+0

아니요. c는 int 포인터의 2 차원 배열입니다. – Arjor

0

당신은 배열에 직접 할당하거나 그러나 C에서 배열 형식으로 캐스팅, 포인터로 배열 붕괴 이후, 당신은 void * 포인터 (예 : memcpy를)에서 데이터를 복사 할 수 없습니다 배열과로 사용 배열, 예를 들면 :

#include <stdio.h> 
#include <string.h> 

int main() { 
    int a1=1, a2=2, a3=3, a4=4; 

    int *a[2][2] = { { &a1, &a2 }, { &a3, &a4 } }; 
    printf("%d %d %d %d\n", *a[0][0], *a[0][1], *a[1][0], *a[1][1]); 

    void *b; 
    b = (void*) a; 

    int *c[2][2]; 
    memcpy(c, b, sizeof(c)); 
    printf("%d %d %d %d\n", *c[0][0], *c[0][1], *c[1][0], *c[1][1]); 

    return 0; 
} 

다음 프로그램을 컴파일하고 실행 당신을 줄 것이다 :

1 2 3 4 
1 2 3 4 

그러나 ca 두 개의 서로 다른 배열이 지금.

1

C와 아마`*** 배열이 아닌 포인터는, 위 참조하면

int a[13][12] ={ 1,2,3 }; 
void *b = &a; 
int (*c)[13][12] = b; 

관련 문제