У меня динамический 2D-массив, хранящийся в указателе void**
, и мне просто интересно, как я должен отливать/разыгрывать значения, чтобы их можно было распечатать?литье из void ** в int
Вот пример того, что я пытаюсь сделать:
/* Assume that I have a data structure called graph with some
* element "void** graph" in it and some element "int order" */
void foo(graph_t *graph)
{
int **matrix;
/*safe malloc works fine, it uses calloc to initialise it all to zeroes*/
matrix = safe_malloc(graph->order * sizeof(int*));
for (i = 0; i < graph->order; i++)
matrix[i] = safe_malloc(graph->order * sizeof(int));
/* storing matrix in the data structure */
matrix = (int**)graph->graph;
printf("%d\n", (int)graph->graph[2][2]);
}
Когда я пытаюсь скомпилировать, компилятор дает мне предупреждение: «разыменования„недействительным *“указатель», и сообщение об ошибке: msgstr "неверное использование выражения void".
Что мне делать, чтобы нарисовать указатель void**
, чтобы я мог печатать элементы с graph->graph
?
EDIT:
спасибо за помощь; i can not make graph-> graph типа int **, потому что он должен содержать многословные типы данных, только у меня возникают проблемы с реализацией, это массив int **.
i changed matrix = (int * ) graph-> graph to graph-> graph = (void *), и это отлично работает, я могу печатать элементы массива, однако теперь, если я реализую отдельная функция:
void print_foo(graph_t *graph)
{
int i,j;
for (i = 0; i < graph->order; i++)
{
for(j = 0; j < graph->order; j++)
{
printf("%d ", ((int**)graph->graph)[i][j]);
}
putchar('\n');
}
}
он просто дает мне ошибку сегментации, однако если я запускаю этот блок кода в исходном Foo (graph_t * график), он печатает массив штрафа 2D.
может кто-то пожалуйста, объясните, что происходит с graph-> график так, что она не будет печатать, если я называю это из другой функции
Примечание: вы пропускаете память с помощью этой строки: 'matrix = (int **) graph-> graph;'. Вы просто назначили 'matrix' возврат вызова' malloc() '. Во-вторых, что такое 'graph_t'? Похоже, у него есть член ('graph'), который является' void ** 'Вы не можете разыменовывать' void * '(что и делает ваш второй индекс). Там нет «типа», и, следовательно, нет механизма знать что-либо об этом. Нет причин иметь пустоту ** для вашего «скрытого» массива. «Void *» будет работать, но вам нужно больше понять указатели перед этими гелями. – WhozCraig
См. Также [Литье 'void **' в 2D-массив 'int' в C] (http://stackoverflow.com/questions/18440205/casting-void-to-2d-array-of-int-c). –