堆栈的局部变量

时间:2012-09-13 07:27:27

标签: c++ c visual-studio-2010 pointers

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 << "b\t" << &b << "\t" << b << endl;
    cout << "a\t" << a  << "\t" << *a << endl;
    cout << "c\t" << &c  << "\t" << c << endl;
    cout << "d\t" << &d  << "\t" << d << endl;
}

我认为 * a 应该指向变量 d ,因为 b d (正如我所想)躺在附近的局部变量堆栈中。但*在另一个地址上有一个点,所以 * a != d 我的问题是为什么呢?它是Visual Studio 2010的功能还是别的什么?

4 个答案:

答案 0 :(得分:9)

不,这是C ++的一个名为 undefined behavior 的功能。你不能在你拥有的数组(或数组边界上的一个位置)之外做指针算术。

您可以a += 1使用此功能,因为a已经是int*,因此+= 1会使其指向下一个整数。 a+=sizeof(int)会将sizeof(int)整数移到右侧。

 +------+------+------+------+------+
 |      |      |      |      |      |      
 +------+------+------+------+------+
    ^      ^                    ^
    |      |                    |
    a     a+1               a+sizeof(int) (assuming sizeof(int) == 4)

再次,从技术上讲,它是未定义的。

答案 1 :(得分:7)

对于初学者来说,我不认为指针算法的工作原理如何。您不需要执行sizeof(int),因为指针已经是指向int的指针,因此编译器知道a++需要提前4个字节。

其次不,你不能指向局部变量,因为你不知道编译器将它们放在内存中的位置,它们的生命周期,或者甚至它们都在内存中。编译器会将许多局部变量优化为CPU寄存器。

编辑:是的,根据有效的评论,我应该澄清你可以指向局部变量,编译器会做正确的事情,但你不能使用指针算法,因为它们可能完全被优化。

答案 2 :(得分:3)

您不能假设所有变量都按照您希望的方式对齐,并且您不能以这种方式使用指针算术。安全使用它的唯一方法是在你的数组范围内使用它。此外,a+=sizeof(int)不会将其移动到指向下一个整数,而是将其移动sizeof(int)个整数。

你在这里依赖于UB,因此你不能指望任何特定的结果。实际上你甚至可能会遇到一个段错误。

答案 3 :(得分:0)

不,它不是Visual Studio 2010功能。指针的算术运算显示未定义的行为。

通常,仅在指向数组元素时使用递增/递减