局部变量堆栈
stack of local variables
void Test2()
{
int c=8;
int b=7;
int d=9;
int *a;
a = &b;
a+=sizeof(int); //I supposed that *a should points on variable d after this
cout << "bt" << &b << "t" << b << endl;
cout << "at" << a << "t" << *a << endl;
cout << "ct" << &c << "t" << c << endl;
cout << "dt" << &d << "t" << d << endl;
}
我认为 *a 应该指向变量 d,因为 b 和 d(正如我所想的(位于局部变量堆栈的附近。但是 *a 指向另一个地址,所以 *a!=d我的问题是为什么会这样?是Visual Studio 2010的功能还是其他功能?
不,这是C++的一个功能,称为未定义行为。您不能在您拥有的数组(或数组边界上的一个位置(之外执行指针算术。
你可以通过a += 1
来工作,因为a
已经是一个int*
,所以+= 1
会让它指向下一个整数。 a+=sizeof(int)
会将其sizeof(int)
整数向右移动。
+------+------+------+------+------+
| | | | | |
+------+------+------+------+------+
^ ^ ^
| | |
a a+1 a+sizeof(int) (assuming sizeof(int) == 4)
同样,从技术上讲,它是未定义的。
对于初学者来说,我不认为指针算术按照你认为的方式工作。你不需要做sizeof(int)
,因为指针已经是指向int
的指针,所以编译器知道a++
需要前进4个字节。
其次,不,你不能指向局部变量,因为你不知道编译器将它们放在内存中的位置,它们的生存期,甚至它们是否在内存中。编译器会将许多局部变量优化到 CPU 寄存器中。
编辑:是的,根据有效的评论,我应该澄清一下,你可以将指针指向局部变量,编译器会做正确的事情,但你不能对它们使用指针算法,因为它们可能会被完全优化。
您不能假设所有变量都按照您想要的方式对齐,也不能以这种方式使用指针算术。安全使用它的唯一方法是在您的数组范围内使用它。此外,a+=sizeof(int)
不会将其移动到指向下一个整数,而是将其移动sizeof(int)
个整数。
您在这里依赖UB,因此您不能期望任何特定结果。实际上,您甚至可能会遇到段错误。
不,它不是Visual Studio 2010功能。指针的算术运算显示未定义的行为。
通常,仅在指向数组元素时使用递增/递减
- 使用的未初始化局部变量'Quick'
- 修复未初始化的局部变量错误
- 局部变量保留函数中的值
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- Gnuplot_i.hpp C++接口绘制局部变量而不是文件
- 如何在函数外部访问函数中局部变量的值?
- 从函数返回变量地址时如何修复"与局部变量关联的堆栈内存地址"?
- 为什么堆栈中的函数局部变量之间存在内存空间
- 函数调用时局部变量在堆栈中的组织方式
- 返回的与局部变量关联的堆栈内存的地址 (C++)
- 局部变量堆栈
- 为什么为堆栈中的局部变量分配的内存多于C++中所需的内存
- 函数的局部变量是如何从堆栈中访问的
- 正在检查堆栈中的局部变量
- 这会使用局部变量破坏堆栈吗
- 局部变量(大数组)的初始化如何影响堆栈大小
- 是为堆栈局部数组创建的指针变量
- 通过创建局部变量减少堆栈指针
- 局部变量的堆栈溢出