2013-08-26 3 views
4

void ** ** int ** 2D 배열에 대한 포인터를 캐스팅하려고합니다.캐스팅 void ** ~ 2D 배열의 int - C

여기에 내가 작업하려고하는 코드가 있습니다. 제거 모든 외부 비트) :

\*assume that i have a data structure called graph with some 
*element "void** graph" in it and some element "int order" */ 

void initialise_graph_data(graph_t *graph) 
{ 
    void **graph_data = NULL; 
    int (*matrix)[graph->order]; 
    size_t size = (graph->order * graph->order) * sizeof(int); 

    graph_data = safe_malloc(size); /*safe malloc works fine*/ 
    matrix = (int(*)[graph->order])graph_data; 
    graph->graph = graph_data; 
} 

내가 그것을 잘 작동하지만 나에게 변수 '매트릭스'가 설정되어 있지만 사용되지 않는다는 경고를 제공하는 컴파일

. 임시 배열 변수를 사용하고 싶지는 않습니다. 왜냐하면이 함수는 배열을 초기화하고, 아무것도 넣지 않기 때문입니다. 내가 너무 좋아> 그래프를 graph- 그것을 assiging하고 때 내가 ** int로 graph_data 직접 캐스팅하려고하면 있지만 :

graph->graph = (int(*)[graph->order])graph_data; 

그것은 나에게 호환되지 않는 포인터 타입 경고에서 할당을 제공합니다.

그냥 제대로 캐스팅하지 않았습니까? 누구든지 임시 "매트릭스"변수없이 어떻게 작동시킬 수 있는지에 대한 제안 사항이 있습니까? 또는 그렇지 않다면, 내가 그 변수를 사용하여 무엇을 할 수 있도록 설정되었지만 사용되지 않았다는 경고를 나에게주지 않습니까?

감사

+0

[C에서'void **'에서'int'로 변환] (http://stackoverflow.com/questions/18456944/casting-from-void-to-int-c)도 참고하십시오. –

답변

34

컴파일러 잘되고, 배열의 배열 (또는 배열에 대한 포인터)는 포인터에 대한 포인터와 동일하지 않다.

 
+--------------+--------------+-----+----------------+--------------+-----+------------------+ 
| matrix[0][0] | matrix[0][1] | ... | matrix[0][N-1] | matrix[1][0] | ... | matrix[M-1][N-1] | 
+--------------+--------------+-----+----------------+--------------+-----+------------------+ 

A와 포인터의 형태에서 "매트릭스"같은 : 배열의 배열의 형태로 크기는 M × N의

매트릭스 : 그냥 그들은 메모리에 배치 될 방법에 대해 생각 포인터 :

 
+-----------+-----------+-----------+-----+ 
| matrix[0] | matrix[1] | matrix[2] | ... | 
+-----------+-----------+-----------+-----+ 
    |   |   | 
    |   |   V 
    |   |   +--------------+--------------+-----+ 
    |   |   | matrix[2][0] | matrix[2][1] | ... | 
    |   |   +--------------+--------------+-----+ 
    |   | 
    |   V 
    |   +--------------+--------------+-----+ 
    |   | matrix[1][0] | matrix[1][1] | ... | 
    |   +--------------+--------------+-----+ 
    | 
    V 
    +--------------+--------------+-----+ 
    | matrix[0][0] | matrix[0][1] | ... | 
    +--------------+--------------+-----+ 

올바른 크기를 할당해도 상관 없습니다. 두 변수는 컴파일러에서 말하는 것과 호환되지 않습니다.

+1

뛰어난 ASCII 아트입니다. 그 대답은 웅변 (그리고 우아한) – Rerito

+1

멋지 네요, 할 수있는 모든 ascii 도구가 무엇입니까? – artm

+1

@artm 아무 생각없이, 나는 방금 사이트의 텍스트 입력 상자에 직접 이러한 것들을 씁니다. :) –