指针在C中给我垃圾虽然在另一个功能中是正确的

时间:2013-07-25 15:10:21

标签: c pointers struct

所以我有一个清单:

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。 老实说,我不确定为什么它不再起作用,任何建议都会受到赞赏。

干杯

2 个答案:

答案 0 :(得分:0)

我想它应该是

*pointr = xpts[...];

而不是

pointr = &xpts;

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

答案 1 :(得分:0)

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