C添加已由函数初始化的struct会覆盖原始

时间:2017-03-25 05:30:44

标签: c c99

Node.h

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 个答案:

答案 0 :(得分:1)

在致电malloc()之前,您无需致电init_nodeinit_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]);
}