Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C:结构中的GMP指针有问题_C++_C_Glib_Gmp - Fatal编程技术网

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

C++ C:结构中的GMP指针有问题,c++,c,glib,gmp,C++,C,Glib,Gmp,我对c相当陌生,我正在实施DHT。 为此,我必须将节点ID存储在列表中 节点ID小于2^160个整数(因此我使用GMP),但我在这里将123设置为一个ID,以保持示例干净 我可以很好地设置节点的ID,并且还可以使用mpz\u out\u str验证它。当我用g_slist_foreach迭代它并打印ID时,它会输出一个巨大的数字,这是完全不相关的 我怀疑它与从gpointer到节点的强制转换有关,或者我可能存储不正确(指针非常新) 代码: #include <glib.h> #inc

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

节点ID小于2^160个整数(因此我使用GMP),但我在这里将123设置为一个ID,以保持示例干净

我可以很好地设置节点的ID,并且还可以使用
mpz\u out\u str
验证它。当我用
g_slist_foreach
迭代它并打印ID时,它会输出一个巨大的数字,这是完全不相关的

我怀疑它与从
gpointer
节点的强制转换有关,或者我可能存储不正确(指针非常新)

代码:

#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, 10, 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;
}
#包括
#包括
#包括
类型定义结构{
mpz_t*节点id;
}节点;
无效打印迭代器(gpointer项,gpointer前缀){
//此外,由于该项属于gpointer类型,
//它必须被转换回节点。
节点*节点=(节点*)项;
//输出一个巨大的、完全随机的数字。
mpz_out_str(标准输出,10,节点->节点id);
printf(“\n”);
};
GSList*添加_节点(GSList*节点){
Node*Node=malloc(sizeof(Node));
mpz_t id;
mpz_init(id);
char*f=“123”;
mpz_set_str(id,f,10);
节点->节点id=&id;
//打印正确的值
mpz_out_str(标准输出,10,节点->节点id);
节点=g_slist_append(节点,节点);
返回节点;
}
int main(int argc,char const*argv[]{
GSList*节点=NULL;
节点=添加_节点(节点);
g_slist_foreach(节点,打印迭代器,‑>);
返回0;
}
相关链接:



带有
节点->节点id=&id节点id指向局部变量。当
add_node
返回时,
id
将被销毁,指针将悬空。取消对它的引用会导致未定义的行为

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

typedef struct {
  mpz_t node_id;
} Node;

为快速反应干杯。但是,我想把它存储在指针中,因为大多数GMP函数需要指针,如果我没有一个GMP存储它,它会稍微烦人一些。@ Aarnav,那么你必须分配内存来存储节点ID,并且在完成后释放它。不要同时使用C和C++标签。如果使用C++编译器,则应该得到一个错误,告诉您使用的是错误指针类型。