读取char *始终具有相同的地址

时间:2018-01-17 11:00:47

标签: c++ queue void void-pointers

我有这样的结构:

struct Node {
    void *data;
    Node *l, *r;
}

我应该使用功能:

void push(Queue *q, void *data, int priority) {
    Node *n = new Node;
    n->data = data;

   // place node in queue
}

我试图在循环中读取字符串,但之后我得到了队列,其中节点中的所有值都相似。

void read_input(Queue *q) {
    string s;
    int p;
    cin >> s >> p;

    // problem is here
    push(q, (void *) s.c_str(), p);
}

void main() {
    Queue *q = create();

    for (int i = 0; i < 5; i++) {
        read_input(q);
    }
}

我该如何解决?为什么string s始终具有相同的地址?

3 个答案:

答案 0 :(得分:2)

像Trantor所说,你使用的是s.c_str(),这是字符串s的私有指针;并且仅在read_input函数内有效。

每次调用read_input都将使用每次到达read_input结束时(超出范围)都会销毁的指针。

你看到相同的指针,可能是因为它在堆栈上。这是巧合。

要解决您的问题,您需要创建字符副本并将其存储在node-&gt;数据中。但是,您还需要考虑删除它的位置。例如。 OnNodeDestroy事件或类似事件。

答案 1 :(得分:1)

问题是,您正在将(临时)指针保存到队列推送调用中类std :: string的临时对象的私有内部。它们在离开read_input后变为无效,甚至可能在内部重用,因此指针似乎不会改变。

相反,您应该使用副本,为字符串分配自己的内存。

答案 2 :(得分:1)

当您创建了一个字符串对象时,编译器将从堆栈中分配内存,并且该字符串对象将始终指向该特定内存位置(在本例中为静态内存分配)。在您的结构中,void *数据指针也将始终指向同一个内存位置。因此,输入到字符串对象中的最后一个值将反映在堆栈中的所有节点中。要解决此问题,您必须每次动态分配内存,以便数据指针指向不同的内存位置,您将得到不同的值。

void read_input(Queue *q) {
    //string s;
    char *s = (char *)malloc(50);
    int p;
    cin >> s >> p;
    push(q, (void *) s, p);
}