C++:不同的语句作用域与相同的语句作用域
C++: Different statement scopes vs. Same statement scope
我找不到任何实际用途,但我仍然很好奇为什么在与不同的语句作用域相同的语句作用域中运行时会得到不同的结果?
变化 #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(。
相关文章:
- 未在作用域中声明unordered_map
- 有没有一种方法可以在编译时获得作用域类名
- C++quit()函数中可能存在作用域问题
- 未在此作用域OpenCV3.4中声明cvSaveImage
- 全局作用域中函数指针的赋值
- 在类函数中初始化外部作用域变量
- 不同作用域中的静态变量和全局变量
- 是同一作用域的函数部分中的函数调用
- 未在此作用域中声明的函数和变量 (C++)
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 将作用域枚举转换为基础类型
- 表达式必须具有完整或无作用域的枚举图
- C++If语句变量作用域
- C++:不同的语句作用域与相同的语句作用域
- 不带内部作用域的 if 语句
- C++中for循环迭代语句期间作用域中的变量
- 是否有可能在不使用指针的情况下将变量的作用域扩展到if语句之外?
- 变量是否可以仅在 if 语句的作用域中定义,类似于通常为 for 循环所做的那样?
- “开关”语句的作用域错误
- 在if语句if C++中创建对象时出现作用域问题