C++;变量x周围的堆栈已损坏 我是C++新手。我正在学习一些基础知识。 我尝试了下面的程序,得到了一个围绕变量x的运行时错误堆栈 int x = 56; int *ptr = &x; ptr[1]=8; cout << *ptr << endl; int x = 56; int *ptr = &x; ptr[1]=8; cout << *ptr << endl; intx=56; int*ptr=&x; ptr[1]=8; cout
ptr[1]实际上是ptr指向的变量旁边的整数。写入这样的内存意味着覆盖任何内容。您可以覆盖其他变量。或返回地址。或堆叠框架。或者其他什么。见鬼,您可能会覆盖ptr本身,这取决于堆栈上变量的排列方式C++;变量x周围的堆栈已损坏 我是C++新手。我正在学习一些基础知识。 我尝试了下面的程序,得到了一个围绕变量x的运行时错误堆栈 int x = 56; int *ptr = &x; ptr[1]=8; cout << *ptr << endl; int x = 56; int *ptr = &x; ptr[1]=8; cout << *ptr << endl; intx=56; int*ptr=&x; ptr[1]=8; cout,c++,C++,ptr[1]实际上是ptr指向的变量旁边的整数。写入这样的内存意味着覆盖任何内容。您可以覆盖其他变量。或返回地址。或堆叠框架。或者其他什么。见鬼,您可能会覆盖ptr本身,这取决于堆栈上变量的排列方式 未定义的行为。编译器可以假定它不会发生。ptr[1]实际上是ptr指向的变量旁边的整数。写入这样的内存意味着覆盖任何内容。您可以覆盖其他变量。或返回地址。或堆叠框架。或者其他什么。见鬼,您可能会覆盖ptr本身,这取决于堆栈上变量的排列方式 未定义的行为。允许编译器假定它不会发生。让我们看看您在这里做
未定义的行为。编译器可以假定它不会发生。ptr[1]实际上是ptr指向的变量旁边的整数。写入这样的内存意味着覆盖任何内容。您可以覆盖其他变量。或返回地址。或堆叠框架。或者其他什么。见鬼,您可能会覆盖ptr本身,这取决于堆栈上变量的排列方式
未定义的行为。允许编译器假定它不会发生。让我们看看您在这里做什么(假定
int
为4字节):
intx=56;
int*ptr=&x;
ptr[1]=8;
cout让我们看看您在这里做什么(假设int
是4个字节):
intx=56;
int*ptr=&x;
ptr[1]=8;
cout您可能期望ptr[1]
表示x
中的第二个字节。但指针算法不是这样工作的。指针是一个int*
,因此算术是在int
大小的“块”中执行的。因此,ptr[1]
是“x
旁边不存在的整数”
您可能会通过将ptr
改为char*
来看到这一点,但要小心,因为这是真正的黑客行为,除非您真的知道自己在做什么,否则可能不是一个好主意
另一个误解是,您指出人类可读的x
值表示形式中的十进制位数与x
在内存中占用的字节数有关;它不是。大概您希望ptr[1]
表示x
中的第二个字节。但指针算法不是这样工作的。指针是一个int*
,因此算术是在int
大小的“块”中执行的。因此,ptr[1]
是“x
旁边不存在的整数”
您可能会通过将ptr
改为char*
来看到这一点,但要小心,因为这是真正的黑客行为,除非您真的知道自己在做什么,否则可能不是一个好主意
另一个误解是,您指出人类可读的x
值表示形式中的十进制位数与x
在内存中占用的字节数有关;事实并非如此。写越界会导致未定义的行为,而未定义行为的症状之一是。。。看起来效果不错@FunouLink:什么是不超出界限?不要学习C++从“教程网站”。拿起一本合适的书来研究它。@funwithlinx“我假设整数变量x中有两个数字”是什么让你认为数字是按数字存储的?为什么你认为ptr[1]
与数字有关<代码>[1]
是访问数组中第二项的方式。而且x
不是数组,因此ptr
不指向数组。`写越界会导致未定义的行为,未定义行为的症状之一是。。。看起来效果不错@FunouLink:什么是不超出界限?不要学习C++从“教程网站”。拿起一本合适的书来研究它。@funwithlinx“我假设整数变量x中有两个数字”是什么让你认为数字是按数字存储的?为什么你认为ptr[1]
与数字有关<代码>[1]
是访问数组中第二项的方式。而且x
不是一个数组,所以ptr
不指向数组。这是因为它不存在,不是因为你“没有初始化它”。这是因为它不存在。好吧,只要你不越界(sizeof(int)),至少char*黑客行为不是未定义的行为。@Paulstellian:没有说它是:)忘了说“至少”:PWell,至少char*黑客行为不是未定义的行为,只要你不越界(sizeof(int))@Paulstellian:没说是:)忘了说“至少”:P
<- 4 bytes->......(rest of the stack)
----------------
| x | |
----------------
^ ^
ptr[0] ptr[1]