所以我试图初始化一个图的节点。问题是变量node->edges_capacity
的值从2变为某个随机int,没有明显的原因,至少据我所知。
此外,当我使用CLion的调试模式时,它按预期打印2!
我对malloc
做错了吗?
typedef struct node {
int id;
int degree;
int edges_capacity;
struct node **edges;
} Node;
Node *node_create(int id) {
Node *node = (Node *) malloc(sizeof(Node *));
if (node == NULL)
exit(1);
node->id = id;
node->degree = 0;
node->edges_capacity = 2;
node->edges = (Node **) malloc(node->edges_capacity * sizeof(Node *));
node_debug(node); // prints a random int for node->edges_capacity instead of 2
return node;
}
void node_debug(Node *node) {
printf("id:%d degree:%d capacity:%d\n", node->id, node->degree, node->edges_capacity);
}
答案 0 :(得分:0)
更改此行:
Node *node = (Node *) malloc(sizeof(Node *));
到:
Node *node = malloc(sizeof(Node));
宣布node
为指向Node
的指针,而不是Node *
。
此外,请参阅this link,了解为何不展示malloc
的结果。
答案 1 :(得分:0)
这一行:
Node *node = (Node *) malloc(sizeof(Node *));'
有几个问题。
Node
的完整尺寸分配足够的空间,而不是pointer to a Node
。void*
,可以将其分配给任何其他指针。抛出返回的值只会使代码变得混乱,使得int更难理解,调试,维护。以下,已发布的代码正在写入程序不拥有的堆内存中的区域。这是未定义的行为,可能导致seg故障事件。您注意到该未定义行为的一个方面。