C++:不同的语句作用域与相同的语句作用域

C++: Different statement scopes vs. Same statement scope

本文关键字:语句 作用域 C++      更新时间:2023-10-16

我找不到任何实际用途,但我仍然很好奇为什么在与不同的语句作用域相同的语句作用域中运行时会得到不同的结果?

变化 #1

int num = 3;
vector<int> ivec;
vector<int*> ipvec;
for (int i = 0; i != num; ++i)
{
    ivec.push_back(i);
    ipvec.push_back(&ivec[i]);
}
for (int i = 0; i != num; ++i)
{
    cout << "ivec:t" << ivec[i] << endl;
    cout << "ipvec:t" << *ipvec[i] << endl;
}

输出

ivec:   0
*ipvec: -572662307
ivec:   1
*ipvec: -572662307
ivec:   2
*ipvec: 2

变化 #2

int num = 3;
vector<int> ivec;
vector<int*> ipvec;
for (int i = 0; i != num; ++i)
    ivec.push_back(i);
for (int i = 0; i != num; ++i)
    ipvec.push_back(&ivec[i]);
for (int i = 0; i != num; ++i)
{
    cout << "ivec:t" << ivec[i] << endl;
    cout << "*ipvec:t" << *ipvec[i] << endl;
}

输出

ivec:   0
*ipvec: 0
ivec:   1
*ipvec: 1
ivec:   2
*ipvec: 2

所以 std::vector 分配内存并根据输入调整大小。因此,在变体 1 中,您交叉了第一个分配大小(在本例中为 2(。因此,[0] 和 [1] 的指针不再有效,因为向量内的数组已被重新分配,现在具有不同的地址。在变体 2 中,您没有这个问题,因为您已经分配了向量的完整列表,因此您添加的所有指针都是有效的。这不是范围的问题,而是来自 std::vector 在列表增长时根据 2 的幂分配内部数组的事实。(因此 [2] 在两次迭代中都有效(因为内部数组最后的大小为 4(。