C:结构中的 GMP 指针问题
C: Trouble with GMP pointers in a struct
我是 c 的新手,我正在实施 DHT。
为此,我必须将节点 ID 存储在列表中。
节点 ID 小于 2^160 个整数(因此我使用 GMP),但我在这里将 123 设置为 ID 以保持示例清晰。
我可以很好地设置节点的 ID,我还用 mpz_out_str
验证了它。当我用 g_slist_foreach
遍历它并打印 ID 时,它输出一个巨大的数字,这是完全不相关的。
我怀疑它与从 gpointer
到 Node
的 cast 有关,或者我可能存储不正确(非常 指针新手)
代码:
#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;
}
相关链接:
https://developer.gnome.org/glib/stable/glib-Singly-Linked-Lists.html
https://gmplib.org/manual/
对于 node->node_id = &id;
,您的 node_id 指向局部变量。当 add_node
returns, id
被销毁并且你的指针悬空。取消引用它会导致未定义的行为。
一个简单的解决方案是将 id 存储在 Node
而不是存储指向它的指针。
typedef struct {
mpz_t node_id;
} Node;
我是 c 的新手,我正在实施 DHT。 为此,我必须将节点 ID 存储在列表中。
节点 ID 小于 2^160 个整数(因此我使用 GMP),但我在这里将 123 设置为 ID 以保持示例清晰。
我可以很好地设置节点的 ID,我还用 mpz_out_str
验证了它。当我用 g_slist_foreach
遍历它并打印 ID 时,它输出一个巨大的数字,这是完全不相关的。
我怀疑它与从 gpointer
到 Node
的 cast 有关,或者我可能存储不正确(非常 指针新手)
代码:
#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;
}
相关链接:
https://developer.gnome.org/glib/stable/glib-Singly-Linked-Lists.html
https://gmplib.org/manual/
对于 node->node_id = &id;
,您的 node_id 指向局部变量。当 add_node
returns, id
被销毁并且你的指针悬空。取消引用它会导致未定义的行为。
一个简单的解决方案是将 id 存储在 Node
而不是存储指向它的指针。
typedef struct {
mpz_t node_id;
} Node;