簡體   English   中英

結構變量的值在相同結構的其他變量的malloc之后更改

[英]Value of struct variable changes after malloc of other variable of same struct

所以我試圖初始化一個圖的節點。 問題是,至少在我所知的范圍內,變量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);
}

更改此行:

Node *node = (Node *) malloc(sizeof(Node *));

至 :

Node *node = malloc(sizeof(Node));

當您聲明node為指向Node類型而不是Node *的指針時。

另外,請參見此鏈接 ,了解為什么不malloc的結果。

這行:

Node *node = (Node *) malloc(sizeof(Node *));'

有幾個問題。

  1. 需要為整個Node分配足夠的空間,而不是pointer to a Nodepointer to a Node
  2. 當調用任何堆分配函數(malloc,calloc,realloc)時,返回的類型為void* ,可以將其分配給任何其他指針。 強制轉換返回值只會使代碼混亂,使int更加難以理解,調試和維護。

以下發布的代碼正在寫入程序不擁有的堆內存中的區域。 這是未定義的行為,可能導致段故障事件。 您注意到該未定義行為的一個方面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM