我有以下代码,当我打印时,我推入矢量的元素不相同。
#include<stdio.h>
#include<iostream>
#include<vector>
using namespace std;
int size = 0;
int main()
{
int i,num1,num2,num;
vector<char *>vec;
for(i=0;i<7;i++)
{
char buffer[30];
if(i%2==0)
{
strcpy(buffer,"hello");
}
else
{
strcpy(buffer,"bye");
}
printf("buffer has %s\n",buffer);
vec.push_back(buffer);
}
for(i=0;i<vec.size();i++)
{
cout<<"CHECK vec["<<i<<"] has "<<vec[i]<<endl;
}
return 0;
}
当我执行时,我得到以下结果:
buffer has hello
buffer has bye
buffer has hello
buffer has bye
buffer has hello
buffer has bye
buffer has hello
CHECK vec[0] has hello
CHECK vec[1] has hello
CHECK vec[2] has hello
CHECK vec[3] has hello
CHECK vec[4] has hello
CHECK vec[5] has hello
CHECK vec[6] has hello
我可以通过gdb 看到以下内容:
(gdb) p vec
$5 = std::vector of length 1, capacity 1 = {**0x7fffffffe790** "bye"}
(gdb) n
11 for(i=0;i<7;i++)
(gdb) p vec
$6 = std::vector of length 2, capacity 2 = {**0x7fffffffe790** "bye", **0x7fffffffe790** "bye"}
矢量元素的地址对于第一和第二元素没有不同,对于其他元素也是如此。任何人都可以解释如何在向量中找到正确的元素以及为什么会发生这种情况。
答案 0 :(得分:1)
问题是你不是在向量中推送一个字符串,而是一个指针。指针将地址保存到内存的一部分,在您的情况下是缓冲区,正如您在调试时看到的那样,该指针具有相同的值。所以实际上你是打印缓冲区,而不是你的矢量单独的字符串。
我的建议是使用STL的全部功能并使用提供的字符串,它将按预期工作。
另请注意,缓冲区数组/字符串在for循环的每次迭代结束时被释放,因此您输入未定义的行为域。
答案 1 :(得分:1)
使用字符串向量。但是如果你真的想使用char *的向量,那就可以了:
#include <stdio.h>
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int size = 0;
int main()
{
int i,num1,num2,num;
vector<char *>vec;
for(i=0;i<7;i++)
{
char *buffer = new char[30];
if(i%2==0)
{
strcpy(buffer,"hello");
}
else
{
strcpy(buffer,"bye");
}
printf("buffer has %s\n",buffer);
vec.push_back(buffer);
}
for(i=0;i<vec.size();i++)
{
char *buffer = vec[i];
cout<<"CHECK vec["<<i<<"] has "<<buffer<<endl;
delete [] buffer;
}
vec.clear();
return 0;
}
答案 2 :(得分:0)
您只是存储缓冲区变量的地址,该变量始终具有相同的内存位置。由于i = 6是最后一个循环,因此缓冲区具有值&#34; hello&#34;并且当您尝试打印矢量时它将打印该值。
编辑:打印向量时,缓冲区已超出范围,可能会打印任何内容,因此未定义的行为。