C++ 打印向量的地址<;char>';s元素显示垃圾
考虑:C++ 打印向量的地址<;char>';s元素显示垃圾,c++,vector,c++17,C++,Vector,C++17,考虑: #include <vector> #include <string> #include <iostream> using namespace std; int main() { vector<char> vChar; vChar.push_back('a'); vChar.push_back('b'); vChar.push_back('c'); vChar.push_back('d');
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main()
{
vector<char> vChar;
vChar.push_back('a');
vChar.push_back('b');
vChar.push_back('c');
vChar.push_back('d');
vector<int> vInt;
vInt.push_back(1);
vInt.push_back(2);
vInt.push_back(3);
vInt.push_back(4);
cout << "For char vector Size:" << vChar.size() << " Capacity:" << vChar.capacity() << "\n";
for(int i=0; i < vChar.size(); i++)
{
cout << "Data: " << vChar[i] << " Address:" << &vChar[i] << "\n";
}
cout << "\nFor int vector Size:" << vInt.size() << " Capacity:" << vInt.capacity() << "\n";
for (int i = 0; i < vInt.size(); i++)
{
cout << "Data: " << vInt[i] << " Address:" << &vInt[i] << "\n";
}
return 0;
}
对于每个基元数据类型,除了char之外,内存位置都是连续的。它在屏幕上打印一些垃圾值
我尝试添加v.reserve(4),但输出是相同的。std::vector::operator[]()
返回T&
,在char
的情况下,其地址将通过重载(2)进行格式化,就好像它是一个以null结尾的C样式字符串(即从&vChar[I]开始的字符串)
并在找到的第一个\0
处停止)
要使其工作,请使用std::cout
对于每个基本数据类型,内存位置都是连续的,除了
对于char
。它在屏幕上打印一些垃圾值
对于这两种情况,“内存位置”是以完全相同的方式连续的。唯一的区别在于如何显示结果。当您这样做时:
cout << "Data: " << vChar[i] << " Address:" << &vChar[i] << "\n";
在这种情况下,输出为:
用于字符向量大小:4容量:4
数据:a地址:0x1c39810
数据:b地址:0x1c39811
数据:c地址:0x1c39812
数据:d地址:0x1c39813
对于整数向量大小:4容量:4
数据:1地址:0x1c39960
数据:2地址:0x1c39964
数据:3地址:0x1c39968
数据:4地址:0x1c3996c
精确地说,1char&
作为std::vector::operator[]
返回一个T&
2请注意,查找未放置在此处的终止null将构成未定义的行为,因为它可能会使您访问不打算为此目的访问的内存
3如果您执行反向转换以使std::cout
将vector
元素视为C样式字符串,您可以自己尝试查看:
cout << "Data: " << vInt[i] << " Address:" << reinterpret_cast<char*>(&vInt[i]) << "\n";
cout
cout << "Data: " << vChar[i] << " Address:" << static_cast<void*>(&vChar[i]) << "\n";
cout << "Data: " << vInt[i] << " Address:" << reinterpret_cast<char*>(&vInt[i]) << "\n";