繁体   English   中英

变量x周围的C ++堆栈已损坏

[英]C++ Stack around the variable x was corrupted

我是C ++的新手。 我正在学习一些基础知识。 我尝试了下面的程序,并遇到运行时错误变量x周围的堆栈已损坏。

int x = 56;
int *ptr = &x;
ptr[1]=8;
cout << *ptr << endl;

但是,如果我将第3行的索引更新为0,例如ptr [0] = 8,则不会出现任何运行时错误,并且控制台将输出显示为8。

我假设整数变量x中有2位数字,并且认为指针索引的有效值将为0和1。 为什么ptr [1]会导致运行时错误,而ptr [3]不会像ptr [2]那样引起任何运行时间错误,而只是将56显示为o / p。

谁能帮助我了解这里的实际情况。 可能是一个更好的教程网站,因为附加内容将帮助我进一步了解该主题。

ptr [1]实际上是ptr指向的变量旁边的整数。 写入此类存储器意味着覆盖任何内容。 您可能会覆盖其他变量。 或寄信人地址。 或堆叠框架。 或其他任何事情。 哎呀,您可能会覆盖ptr本身,具体取决于堆栈上变量的排列方式。

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

让我们在这里看看你在做什么(假设int是4个字节):

int x = 56;
int *ptr = &x;
ptr[1]=8;
cout << *ptr << endl;
<- 4 bytes->......(rest of the stack)
 ----------------
|   x     |      |
 ----------------
^         ^
ptr[0]   ptr[1]

因此, pre[1]正在写入尚不存在的存储位置。 所以,你在写数据out-of-bound

大概您期望ptr[1]表示x的第二个字节 但这不是指针算法的工作原理。 指针是int* ,因此算术是在int -sizes的“块”中执行的。 因此, ptr[1]x旁边不存在的整数。

您可能会改为通过将ptr用作char*来看到此功能,但是要小心,因为这是真正的黑客,除非您真的知道自己在做什么,否则可能不是一个好主意。

另一个误解是您指出x值的人类可读表示形式中的小数位数与x占用内存中的字节数有关; 没有。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM