C添加已由函数初始化的结构覆盖原始结构

标签 c c99

节点.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/

相关文章:

c - 主函数之外的 printf 抛出错误

c - 为什么该字符串返回 "@"或弄乱我的 "Z"?

c - 不同头文件中的两个结构,都使用另一个

c - 如何为其他语言(word2vec)制作预训练 vector ?

c - 位掩码 (char)(0xFFFFFFB8 & 0xFF) 在 c 中不起作用

c - 在 signed int 和 unsigned int 之间转换时是否需要类型转换?

c - 更新函数内的字符串数组

c++ - C++ 中的 C 复数?

c - 用C语言中的宏创建假函数有多少可能?

c - 如何使用终端在 gcc 中启用 c99 模式