所以我有一个清单:
struct list_elem {
char* key;
void* value;
struct list_elem *prev;
struct list_elem *next;
};
当我尝试从两个不同的函数中查看它的关键和值时,但是使用相同的代码来尝试查看值是什么,一个给了我正确的答案,一个没有。
我将元素添加到我的列表中:
XPoint xpts[npts + 1];
...do stuff ...
XPoint *pointr = (XPoint*) calloc(npts, sizeof(XPoint));
pointr = &xpts;
list_insert(&w->qr_coord, data, pointr);
然后我尝试在一个函数(FunctionA)中获取这样的键和值:
void list_insert(struct list *list, char* key, const void *value) {
struct list_elem *elem = list_start(list);
while (has_next(elem)) {
XPoint pointr = (XPoint*) elem->value;
printf("%s\n", elem->key); //THIS IS RIGHT
printf("(%i,%i)\n", pointr->x, pointr->y); //THIS IS RIGHT
//more code
}
}
在另一个函数(FunctionB)中我这样做:
struct list *qr_list = &proc->window->qr_list;
struct list_elem *elem = list_start(qr_list);
XPoint pointr = (XPoint*) elem->value;
printf("%s\n", elem->key); //THIS COMES OUT RIGHT
printf("(%i,%i)\n", pointr->x, pointr->y); //THIS IS WRONG
错误的答案给了我随机数字,如0,2345,-129953。 老实说,我不确定为什么它不再起作用,任何建议都会受到赞赏。
干杯
答案 0 :(得分:0)
我想它应该是
*pointr = xpts[...];
而不是
pointr = &xpts;
当前代码不使用已分配的内存,但存储xpts
的地址。如果那是一个局部变量,那么该地址很快就会失效。即使xpts
是全局的,&xptr
也是XPoint **
,而不是XPoint *
答案 1 :(得分:0)
您正在将xpts重新分配给刚刚分配的指针。这导致内存泄漏。 你需要复制点。