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++;变量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本身,这取决于堆栈上变量的排列方式


未定义的行为。编译器可以假定它不会发生。

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]