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ループの外で初期化したときに、この問題が発生していないように見えます。
[malloc関数をキャストしていない](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – Barmar
あなたのプログラムの残りの部分はありますか? [mcve] – sigjuice
'(* node) - > name = name;' - > '(* node) - > name = strdup(name);'を参照してください。また、多くのメモリリークがあります。 – BLUEPIXY