2012-07-01 5 views
1

노드와 모서리가있는 간단한 그래프를 만듭니다. 나는 기능을 가지고 있지만 메모리 버그가있다. C에서포인터 태그 구조가있는 Malloc

typedef struct Graph_s* Graph; 

및 구현 :

나는 타입 정의 헤더 파일에 구조체가있다. 건설

struct Graph_s { 
    Node* nodeArray; 
    Edge* edgeArray; 
    size_t edges; 
    size_t nodes; 
}; 

그리고 기능 : 파일

Graph create_graph() { 
    Graph newGraph = malloc(sizeof(Graph)); 

    newGraph->edges = 0; 
    newGraph->nodes = 0; 
    return newGraph; 
} 

라인 Graph newGraph = malloc(sizeof(Graph))는 제공 : Valgrind의에서 Invalid write of size 8.

+0

몇 가지 스타일 제안 : 포인터 유형에 대한 typedef는 권장되지 않으며 구조체 유형에 대한 typedef는 필요하지 않습니다. 나는'struct Graph {...};를 선언하고 구조체를'struct Graph'라고하고 포인터 유형을'struct Graph *'라고 부릅니다. 따라서 :'struct Graph newGraph = malloc (sizeof * newGraph);'. 그리고 매개 변수가없는 함수는'(void)'를 사용해야합니다 : struct Graph create_Graph (void) {...}' –

+0

입력 해 주셔서 감사합니다! 그것은 명백하게 상황을 명확하게 유지합니다. – Jerry

답변

3

malloc(sizeof(Graph))은 포인터 용으로 충분한 메모리를 할당하고 있습니다. 그것을 malloc(sizeof(struct Graph_s))으로 변경하십시오.

+0

꺼냈다! 브렛 감사합니다! – Jerry

+0

더 좋은 점은 :'graph newGraph = malloc (sizeof * newGraph);' –

+0

그리고 이것은 모든 것을 typedef'ing하는 것의 또 다른 예입니다. 정의한 유형이 있습니다. – tbert