堆栈的局部变量

Myo*_*tis 3 c c++ pointers visual-studio-2010

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;
}
Run Code Online (Sandbox Code Playgroud)

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

Luc*_*ore 9

不,这是C++的一个称为未定义行为的功能.你不能在你拥有的数组(或数组边界上的一个位置)之外做指针算术.

你可以让它工作,a += 1因为a已经是a int*,所以+= 1会指向下一个整数.a+=sizeof(int)将它sizeof(int)整数移到右边.

 +------+------+------+------+------+
 |      |      |      |      |      |      
 +------+------+------+------+------+
    ^      ^                    ^
    |      |                    |
    a     a+1               a+sizeof(int) (assuming sizeof(int) == 4)
Run Code Online (Sandbox Code Playgroud)

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


Gaz*_*yer 7

对初学者来说,我不认为指针算法的工作方式与你的思维方式有关.你不需要这样做sizeof(int),因为指针已经是指针int,所以编译器知道a++需要提前4个字节.

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

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