读取字符 * 始终具有相同的地址
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
总是有相同的地址?
就像Trantor说的,你使用s.c_str((,它是字符串s的私有指针;并且仅在函数内部有效read_input。
每次调用read_input都将使用此指针,每次到达终点(超出范围(时都会销毁该指针read_input该指针。
您会看到相同的指针,可能是因为它位于堆栈上。这是一个巧合。
要解决您的问题,您需要创建字符的副本并将其存储在节点>数据中。但是,您还需要考虑在哪里删除它。例如,OnNodeDestroy 事件或类似事件。
问题是,您正在队列推送调用中保存指向类 std::string 临时对象的私有内部的(临时(指针。它们在离开read_input后变得无效,甚至可以在内部重复使用,因此指针似乎不会改变。
相反,您应该使用副本,为字符串分配自己的内存。
创建字符串对象后,编译器将从堆栈中分配内存,并且字符串对象将始终指向该特定内存位置(在本例中为静态内存分配(。在您的结构中,void *数据指针也将始终指向相同的内存位置。因此,输入到字符串对象中的最后一个值将反映在堆栈中的所有节点中。要解决此问题,您必须每次动态分配内存,以便数据指针应指向不同的内存位置,您将获得不同的值。
void read_input(Queue *q) {
//string s;
char *s = (char *)malloc(50);
int p;
cin >> s >> p;
push(q, (void *) s, p);
}
相关文章:
- 如何获取C++字符数据类型的地址
- 打印字符数组地址的正确方法
- 为什么我无法获取 MSVS2019 / C++ 中字符或uint8_t变量的内存地址?
- 使用 C++将 IP 地址附加到字符*
- C++指针分配字符数组的地址
- 为什么 C++ 中的字符数组返回其项目而不是地址?
- 字符数组地址和整数数组地址
- 在带有 (void*) 强制转换的字符串中打印字符的内存地址
- 为什么这段代码给出错误......'a'是指针到字符指针,应该存储's'的地址,因为s是指向数组的第一个元素的指针
- 如何在 2D 字符数组中打印 [x][y] 元素的地址?(C++)
- 读取字符 * 始终具有相同的地址
- C++ 在 64 位平台中传递字符数组地址
- 获取字符数组地址,然后转换为指针字符
- 如何反转字符指针数组的地址
- 如何使用字符指针查找字符串的地址
- 指向字符地址的指针的值
- 将文件的常量字符* 地址传递给 ifstream 对象的问题
- 为什么十六进制地址是14个字符
- c++seekg似乎返回了一个十六进制地址,而不是.txt文件中的实际字符
- 字符类型变量的地址