2016-04-01 3 views
-2

Я просто столкнулся проблемы таНоса в моем назначении // Это мой файл заголовокMingw использование таНос для структуры

struct vertex_t { 
    int id; 
    char *label; 

    /* A list of vertices representing incoming edges */ 
    List in; 
    /* A List of vertices representing outgoing edges */ 
    List out; 
}; 
struct graph_t { 
    /* Number of vertices */ 
    int order; 
    /* Numb er of edges */ 
    int size; 
    Vertex vertices; 
}; 

// Нам не разрешено изменять файл заголовок выше. В моем основном файле, как можно malloc вершины в графе?

Graph new_graph(int order) { 
    Graph graph; 
    int i; 
    graph=NULL; 
    graph=(Graph)malloc(sizeof(Graph)); 
    assert(graph); 
    graph->order=order; 
    graph->size=0; 
    graph->vertices=(Vertex*)malloc((order+100000)*sizeof(Vertex));//!!!!!!!!!!!!!!!!!!!this line!!!! 
    for(i=0;i<order;i++){ 
     graph->vertices[i].label=(char*)malloc(MAX_LINE_LEN*sizeof(char)); 
     graph->vertices[i].in=NULL; 
     graph->vertices[i].out=NULL; 
    } 
    return graph; 
} 

Я могу добавить исключительно большое количество в malloc, чтобы предотвратить утечку памяти.

+2

Не ответ, но [не приведите результат 'malloc'] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). например 'graph = (Graph) malloc (sizeof (Graph)); и другие. –

+0

Что такое тип 'Vertex'? –

+0

Где находится 'typedef' для' Vertex' ?? –

ответ

1

Это трудно увидеть все ошибки, как вы не даете полную программу, но, насколько я вижу, что вы сделали ошибку с этой линией:

graph=(Graph)malloc(sizeof(Graph)); 
graph->vertices=(Vertex*)malloc((order+100000)*sizeof(Vertex)); 

Graph и Vertex, кажется, тип указателя , так что вы должны сделать это вместо того, чтобы:

graph = malloc(sizeof(struct graph_t)); 
graph->vertices = malloc((order)*sizeof(struct vertex_t)); 

Я полагаю, Vertex тип указателя, связанный с struct vertex_t и Graph является тип указателя, связанный с struct graph_t в заголовках.

Мы не используем malloc() для выделения памяти для самого указателя, но для данных, которые он указывает. Размер зависит от данных. Если pType является типом указателя, например char *, int * или struct my_struct *, sizeof(pType) будет всегда одинаковым (8 для 32-разрядной программы или 16 для 64-разрядной программы, например).

0
Graph graph; 
graph = (Graph)malloc(sizeof(Graph)); 

Это первая проблема. Соблюдайте правильные модели:

struct Foo { ... }; 

Foo* foo = malloc(sizeof(Foo)); // one way 
foo = malloc(sizeof(*foo)); // the other way, handy when you are not sure what your type is 

Обратите внимание, как вы передаете в размере структуры и получить обратно указатель.

То же самое происходит и со вторым распределением:

graph->vertices = (Vertex*)malloc((order+100000)*sizeof(Vertex)); 

В вашем коде как Graph и Vertex являются указателями, но вы хотите выделить указываемые структуру, а не указатели.

Кроме того, вы передаете результат Vertex*, но назначьте его Vertex. Это должно было вызвать предупреждение компилятора. Вы должны читать, понимать и устранять все предупреждения, никаких исключений. Я рекомендую настроить ваш компилятор так, чтобы он рассматривал предупреждения как ошибки.

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