不了解C++stack<char*>行为
我被困了两个小时试图了解这个简单的 C++ 测试程序中发生了什么,但仍然没有明白。它应该只接收三个字符串作为输入,将它们插入一个堆栈,最后打印该堆栈的所有元素。
#include <iostream>
#include <stack>
#include <cstring>
using namespace std;
int main(){
stack<char*> stk;
int stringLength;
for (int i=0; i<3; i++){
char new_element[200];
scanf("%s", new_element);
stringLength = strlen(new_element);
stk.push(new_element);
}
cout << "Stack content: ";
while(!stk.empty()){
cout << stk.top() << " ";
stk.pop();
}
cout << endl;
}
奇怪的是,最终输出的是同一个元素(最后添加的)打印了 3 次,这对我来说毫无意义。
例如,如果输入是:
John
Mary
Rick
那么当前的输出是
Rick
Rick
Rick
谁能帮我理解和解决这个问题?
回答
char new_element[200];
// [...]
stk.push(new_element);
您在堆栈对象中推送相同的指针。
更糟糕的是,您正在推送系统堆栈指针,因此如果您要从函数外部使用堆栈,则会出现访问冲突(Linux 中的段错误)并崩溃。在您的情况下,您不会从外部使用它们,因为堆栈对象也在堆栈上。
无论如何,有两个快速修复:
-
编写正确的代码:使用
string并让编译器找出复制它们并根据需要清理它们。 -
不要编写正确的代码:用于
strdup获取唯一的字符串指针。您可能想也可能不想在某个时候释放它们,对于选择这条路线的人来说,这似乎总是可选的。