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

精确地说,1
char&
作为
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";