-1

所以我有一个清单:

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。老实说,我不确定为什么它不再起作用,任何建议将不胜感激。

干杯

4

2 回答 2

0

我想应该是

*pointr = xpts[...];

代替

pointr = &xpts;

当前代码不使用您分配的内存,而是存储xpts. 如果这是一个局部变量,那个地址很快就会失效。即使xpts是全局的,&xptr也是类型XPoint **的,而不是XPoint *

于 2013-07-25T15:18:15.587 回答
0

您正在将 xpts 重新分配给刚刚分配的指针。这导致内存泄漏。您需要将这些点复制过来。

于 2013-07-25T15:28:53.633 回答