2013-08-26 1 views
4

я пытаюсь бросить пустоту ** указатель на Int ** 2D массива в Cлитье аннулируются ** в 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_data непосредственно к междунар **, когда я assiging его graph-> график так:

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

это дает мне задание от предупреждения несовместимого типа указателя.

Я просто не правильно его отбрасываю? есть ли какие-либо предложения относительно того, как я могу заставить его работать без промежуточной «матричной» переменной? или, если нет, что я могу сделать с этой переменной, чтобы она не давала мне предупреждения о том, что она установлена, но не используется?

благодаря

+0

См. Также [Кастинг от 'void **' до 'int' в C] (http://stackoverflow.com/questions/18456944/casting-from-void-to-int-c). –

ответ

34

Компилятор прав, массив массивов (или указатель на массив) не то же самое, как указатель на указатель. Просто подумайте о том, как они будут изложены в памяти:

матрица размером MxN в виде массива массивов:

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

А и то же «матрица» в виде указателя указатель:

 
+-----------+-----------+-----------+-----+ 
| 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 Не знаю, я просто пишу эти вещи прямо в текстовом поле ввода здесь, на сайте. :) –

 Смежные вопросы

  • Нет связанных вопросов^_^