使用valgrind在C中的堆栈方向的相反结果

xun*_*ang 0 c stack-overflow stack

我使用valgrind来找出堆栈方向的混乱问题.

看下面的代码,我想知道为什么运算符"p1 + = 0x80;*p1 = 1"有效且运算符"p2 - = 0x80;*p2 = 1"根据valgrind无效写入?

我认为所有的变量都根据操作系统在堆栈中分配,并且它正在增长到较低的地址,所以我认为" - ="是有效的,而"+ ="是无效的,因为它可能比较大到堆栈顶部可能不在堆栈限制中.

#include <stdlib.h>

int main()
{
    int a;
    int *p1 = &a;
    p1 += 0x80;
    int *p2 = &a;
    *p1 = 1;
    p2 -= 0x80;
    *p2 = 1;
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

And*_*rsK 7

没有该代码给出未定义的行为.

你的堆栈由一个整数和一个整数指针组成.

当你在内存(过去的堆栈)中向前移动指针0x80 ints并在那里写入你已经调用了未定义的行为时,你不能对之后发生的事情充满信心.

将指针移动到那里当然是有效的,你可以将它移动到任何地方,但不能在那里写.