2017-03-25 8 views
1

Node.hCだから、私は、このノードを有するオリジナル

typedef struct Node Node;               
struct Node{ 
    int rank; 
    int marked; 
    size_t nSize; 
    size_t nCapacity; 
    char * name; 
    Node * predecessor; 
    Table * weights; 
    void (*print)(Node * toPrint); ///< print function for printing all info 
    Node ** neighbors; 
}; 
void init_node(Node ** node, char * name, void (*printNode)(Node * n)); 

Node.c

void init_node(Node ** node, char * name, void (*printNode)(Node * n)){                                                    
    *node = (Node *) malloc(sizeof(Node)); 
    if (node == NULL){ 
     assert(NULL); 
    } 
    (*node)->rank=0;                                                                
    (*node)->marked=0;                                                                
    (*node)->nSize=0;                                                                
    (*node)->name=name;                                                                
    (*node)->predecessor=(Node *)malloc(sizeof(Node));                                                        
    if ((*node)->predecessor == NULL){                                                           
     assert(NULL);                                                                
    }                                                                    
    (*node)->nCapacity = INITIAL_CAPACITY;                                                           
    (*node)->neighbors=(Node **)calloc((*node)->nCapacity, sizeof(Node *)); 
    if ((*node)->neighbors == NULL){ 
     assert(NULL); 
    } 
    (*node)->weights = create(strHash, strEquals, strLongPrint); 
    (*node)->print = printNode; 
} 

main.cの

for (size_t i = 0; i < TEST_AMOUNT ; i++){ 
     char str[TEST_AMOUNT + 1] =""; 
     sprintf(str, "%zu", i); 
     Node * n = malloc(sizeof(*n)); 
     init_node(&n, str, printNode); 
     nodes[i] = *n; 
     nodes[i].print(&nodes[i]); 
    } 

    printf("First: %p Second: %p\n", (void *)&nodes[0].name, (void *)&nodes[1].name); 
    printf("\n\nCreated an array of %d Nodes\n\n", TEST_AMOUNT); 
    for (size_t i = 0; i < TEST_AMOUNT; i++){ 
     nodes[0].print(&nodes[0]); 
    } 

をオーバーライドクラスを作成し、ノードを作成してから上記のようなforループで初期化し、その値を配列に代入するときにこの問題が発生します。配列には、0-TEST_AMOUNTとラベル付けされた一連のノードではなく、同じノードのTEST_AMOUNT番号が格納されます。 ノードを作成してforループの外で初期化したときに、この問題が発生していないように見えます。

+1

[malloc関数をキャストしていない](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – Barmar

+0

あなたのプログラムの残りの部分はありますか? [mcve] – sigjuice

+1

'(* node) - > name = name;' - > '(* node) - > name = strdup(name);'を参照してください。また、多くのメモリリークがあります。 – BLUEPIXY

答えて

1

init_nodeを呼び出す前にmalloc()に電話する必要はありません。 init_node()はノードのスペースを割り当て、呼び出し元の変数に割り当てます。そのため、変数のアドレスを渡す必要があります。

nodes配列の宣言は表示されませんが、ポインタの配列として宣言する必要があります。次に、これらのポインタを介して間接的にノードのデータにアクセスする必要があります。

Node *nodes[TEST_AMOUNT]; 

for (size_t i = 0; i < TEST_AMOUNT ; i++){ 
    char str[TEST_AMOUNT + 1] =""; 
    sprintf(str, "%zu", i); 
    init_node(&nodes[i], str, printNode); 
    nodes[i]->print(nodes[i]); 
} 
関連する問題