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)
没有该代码给出未定义的行为.
你的堆栈由一个整数和一个整数指针组成.
当你在内存(过去的堆栈)中向前移动指针0x80 ints并在那里写入你已经调用了未定义的行为时,你不能对之后发生的事情充满信心.
将指针移动到那里当然是有效的,你可以将它移动到任何地方,但不能在那里写.