C: 结构体中的 GMP 指针有问题

问题描述

我相当刚接触 c,我正在实施 DHT。 为此,我必须将节点 ID 存储在列表中。

节点 ID 是

我可以很好地设置节点的 ID,并且我还使用 mpz_out_str 对其进行了验证。当我用 g_slist_foreach 迭代它并打印 ID 时,它输出一个巨大的数字,这是完全不相关的。

我怀疑这与从 gpointerNode强制转换有关,或者我可能存储错误(非常新的指针)
代码:

#include <glib.h>
#include <gmp.h>
#include <stdio.h>

typedef struct {
  mpz_t *node_id;
} Node;

void print_iterator(gpointer item,gpointer prefix) {
  // Also,since the item is of type gpointer,// It has to be casted back to Node.
  Node *node = (Node *)item;
  // outputs a HUGE,completely random number.
  mpz_out_str(stdout,10,node->node_id);
  printf("\n");
};

GSList *add_node(GSList *nodes) {
  Node *node = malloc(sizeof(Node));
  mpz_t id;
  mpz_init(id);
  char *f = "123";
  mpz_set_str(id,f,10);
  node->node_id = &id;
  // prints correct value
  mpz_out_str(stdout,node->node_id);
  nodes = g_slist_append(nodes,node);
  return nodes;
}

int main(int argc,char const *argv[]) {
  GSList *nodes = NULL;
  nodes = add_node(nodes);
  g_slist_foreach(nodes,print_iterator,"‑‑>");
  return 0;
}

相关链接:

https://developer.gnome.org/glib/stable/glib-Singly-Linked-Lists.html
https://gmplib.org/manual/

解决方法

使用 node->node_id = &id;,您的 node_id 指向一个局部变量。当 add_node 返回时,id 被销毁并且您的指针悬空。取消引用它会导致未定义的行为。

一个简单的解决方案是将 id 存储在 Node 中,而不是存储指向它的指针。

typedef struct {
  mpz_t node_id;
} Node;

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...