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循环之外初始化它时,我似乎没有这个问题,并且很好奇是什么导致了这个问题。
答案 0 :(得分:1)
在致电malloc()
之前,您无需致电init_node
。 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]);
}