读取 char * 始终具有相同的地址
Reading to char * always has same address
我有这样的结构:
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
总是有相同的地址?
问题是,您在队列推送调用中保存了指向 class std::string 的临时对象的私有内部结构的(临时)指针。它们在离开read_input后就失效了,甚至可能在内部被重用,所以指针似乎没有改变。
相反,您应该使用副本,为字符串分配您自己的内存。
就像 Trantor 说的,你使用 s.c_str() 是字符串 s 的私有指针;并且仅在 read_input 函数内部有效。
每次调用 read_input 都会使用这个指针,每次到达 read_input 结束(超出范围)时都会被销毁。
您看到相同的指针,可能是因为它在堆栈上。真是巧合。
要解决您的问题,您需要创建角色的副本并将它们存储在节点->数据中。但是,您还需要考虑将其删除的位置。例如。 OnNodeDestroy 事件或类似事件。
创建字符串对象后,编译器将从堆栈中分配内存,并且该字符串对象始终仅指向该特定内存位置(在本例中为静态内存分配)。在您的结构中, void *data 指针也将始终指向同一内存位置。因此,输入字符串对象的最后一个值将反映在堆栈中的所有节点中。要解决此问题,您必须每次都动态分配内存,以便数据指针指向不同的内存位置,您将获得不同的值。
void read_input(Queue *q) {
//string s;
char *s = (char *)malloc(50);
int p;
cin >> s >> p;
push(q, (void *) s, p);
}
我有这样的结构:
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
总是有相同的地址?
问题是,您在队列推送调用中保存了指向 class std::string 的临时对象的私有内部结构的(临时)指针。它们在离开read_input后就失效了,甚至可能在内部被重用,所以指针似乎没有改变。
相反,您应该使用副本,为字符串分配您自己的内存。
就像 Trantor 说的,你使用 s.c_str() 是字符串 s 的私有指针;并且仅在 read_input 函数内部有效。
每次调用 read_input 都会使用这个指针,每次到达 read_input 结束(超出范围)时都会被销毁。
您看到相同的指针,可能是因为它在堆栈上。真是巧合。
要解决您的问题,您需要创建角色的副本并将它们存储在节点->数据中。但是,您还需要考虑将其删除的位置。例如。 OnNodeDestroy 事件或类似事件。
创建字符串对象后,编译器将从堆栈中分配内存,并且该字符串对象始终仅指向该特定内存位置(在本例中为静态内存分配)。在您的结构中, void *data 指针也将始终指向同一内存位置。因此,输入字符串对象的最后一个值将反映在堆栈中的所有节点中。要解决此问题,您必须每次都动态分配内存,以便数据指针指向不同的内存位置,您将获得不同的值。
void read_input(Queue *q) {
//string s;
char *s = (char *)malloc(50);
int p;
cin >> s >> p;
push(q, (void *) s, p);
}