2017-03-25 16 views
1

Node.hd。添加结构已经由函数初始化会覆盖原有的

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循环中初始化它,然后将该值赋给数组。该数组然后包含相同节点的TEST_AMOUNT数字,而不是一系列标记为0-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]); 
}