2013-08-27 4 views
-1

У меня динамический 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-> график так, что она не будет печатать, если я называю это из другой функции

+0

Примечание: вы пропускаете память с помощью этой строки: 'matrix = (int **) graph-> graph;'. Вы просто назначили 'matrix' возврат вызова' malloc() '. Во-вторых, что такое 'graph_t'? Похоже, у него есть член ('graph'), который является' void ** 'Вы не можете разыменовывать' void * '(что и делает ваш второй индекс). Там нет «типа», и, следовательно, нет механизма знать что-либо об этом. Нет причин иметь пустоту ** для вашего «скрытого» массива. «Void *» будет работать, но вам нужно больше понять указатели перед этими гелями. – WhozCraig

+0

См. Также [Литье 'void **' в 2D-массив 'int' в C] (http://stackoverflow.com/questions/18440205/casting-void-to-2d-array-of-int-c). –

ответ

1

Дано:

typedef struct graph_t 
{ 
    int order; 
    void **graph; 
} graph_t; 

и предполагая, что вы выделяете graph->graph как массив int * и ряд массивов int, то вы можете, если необходимо, написать:

#include <stdio.h> 
#include <stdlib.h> 

typedef struct graph_t 
{ 
    int order; 
    void **graph; 
} graph_t; 

extern void *safe_malloc(size_t n); 
extern void foo(graph_t *graph); 

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 (int i = 0; i < graph->order; i++) 
     matrix[i] = safe_malloc(graph->order * sizeof(int)); 

    /* storing matrix in the data structure */ 
    graph->graph = (void **)matrix; // Reverse order of assignment 
    // C compiler complains without the cast - the cast is nasty! 

    printf("%d\n", ((int **)graph->graph)[2][2]); 
} 

Код должен проверить, что graph->order >= 3 во избежание проблем с переполнением.

Однако, структура довольно неприятная, и необходимое оформление в заявлении printf() достаточно, чтобы вы поняли, почему это противно. Вы были бы гораздо лучше с int **graph; в структуре:

#include <stdio.h> 
#include <stdlib.h> 

typedef struct graph_t 
{ 
    int order; 
    int **graph; 
} graph_t; 

extern void *safe_malloc(size_t n); 
extern void foo(graph_t *graph); 

void foo(graph_t *graph) 
{ 
    int **matrix; 

    matrix = safe_malloc(graph->order * sizeof(int*)); 

    for (int i = 0; i < graph->order; i++) 
     matrix[i] = safe_malloc(graph->order * sizeof(int)); 

    graph->graph = matrix; 

    printf("%d\n", graph->graph[2][2]); 
} 

Оба эти компилируется без предупреждения, даже в жестких уровней предупреждения. Ни один из них не был официально протестирован, создав функцию main() для ее использования. Конечно, вы также должны иметь функцию bar(graph_t *graph), чтобы освободить выделенную память.

+0

благодарит за вашу помощь. я должен держать график как указатель void **, чтобы я мог хранить несколько типов данных в этом пространстве. У меня есть следующий вопрос, основанный на вашем ответе, но я могу просто изменить свой оригинальный вопрос, чтобы я мог использовать код. – guskenny83

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