节点.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));
节点.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;
}
主.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 循环之外初始化它时,我似乎没有遇到这个问题,并且很好奇是什么导致了这个问题。
最佳答案
在调用 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]);
}
关于C添加已由函数初始化的结构覆盖原始结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43012918/