如何解决C: 结构体中的 GMP 指针有问题
我相当刚接触 c,我正在实施 DHT。 为此,我必须将节点 ID 存储在列表中。
节点 ID 是
我可以很好地设置节点的 ID,并且我还使用 mpz_out_str
对其进行了验证。当我用 g_slist_foreach
迭代它并打印 ID 时,它输出一个巨大的数字,这是完全不相关的。
我怀疑这与从 gpointer
到 Node
的 强制转换有关,或者我可能存储错误(非常新的指针)
代码:
#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;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。