struct变量的值在相同struct的其他变量的malloc之后发生变化

时间:2017-03-03 20:15:51

标签: c struct malloc

所以我试图初始化一个图的节点。问题是变量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);
}

2 个答案:

答案 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 *));'

有几个问题。

  1. 需要为Node的完整尺寸分配足够的空间,而不是pointer to a Node
  2. 当调用任何堆分配函数(malloc,calloc,realloc)时,返回的类型为void*,可以将其分配给任何其他指针。抛出返回的值只会使代码变得混乱,使得int更难理解,调试,维护。
  3. 以下,已发布的代码正在写入程序不拥有的堆内存中的区域。这是未定义的行为,可能导致seg故障事件。您注意到该未定义行为的一个方面。