-1

我在下面的代码中的目标是查看内存地址实际上是由于 p++ (它确实如此)而改变的,但我无法弄清楚为什么程序停止(但没有终止)以显示内存地址超过 i= 242?换句话说,程序在 242 行之后什么都不做,最后一行“就是这样”永远不会执行。

谢谢

#include <iostream>
using namespace std;

int main()
{
cout<<"start..."<<endl;
int x=100;
int *p = &x;

for (int i=0; i<300; i++)
{
    cout<<i<<". &p:="<<p<<" v:="<<*p<<endl;
    p++;
}

cout << "that's it!" << endl;
return 0;
}

结果:

start...
0. &p:=0x7fff59c30c34 v:=100
1. &p:=0x7fff59c30c38 v:=1706885214
2. &p:=0x7fff59c30c3c v:=32767
3. &p:=0x7fff59c30c40 v:=1505954904

. . .

240. &p:=0x7fff59c30ff4 v:=946024503
241. &p:=0x7fff59c30ff8 v:=892744247
242. &p:=0x7fff59c30ffc v:=13617
4

5 回答 5

2
int x=100;
int *p = &x; //you allocated one int and you can point to it

for (int i=0; i<300; i++)
{
    cout<<i<<". &p:="<<p<<" v:="<<*p<<endl;
    p++;
//  ^^^
//  here you are pointing your pointer at next 4 bytes, but 
//  dereferencing it is an undefined behavior that you actually do observe
//  you don't know what is next address pointing to and you are not allowed
//  to dereference it
}

正如我在评论中所说,这是未定义的,可能会顺利运行 100 年,然后停止运行。

您的测试解决方案可能是:

int *p = new int[300]; //now you can point to any address within this table

for (int i=0; i<300; i++)
{
    cout<<i<<". &p:="<<p<<" v:="<<*p<<endl;
    p++;
}
于 2013-06-30T00:12:47.850 回答
1

直接运行程序而不是在 cmd 中运行时。一切都好。(即使我循环了 3000 次)

然后我在 cmd 控制台中运行它时被冻结了。

所以我猜它主要是像程序和 cmd shell 可能共享内存从而导致冻结。

所以它真的取决于操作系统。

于 2013-06-30T01:05:23.177 回答
1

使用 p++,您正在尝试访问一些未分配/分配给您的程序的内存。我猜 242 只是您的操作系统阻止您尝试的任意数字。它不完全正确,也不会前后一致。

于 2013-06-30T00:13:43.183 回答
1

您的程序在多个帐户上有未定义的行为。

int x=100; int *p = &x;

到目前为止,一切都很好。这允许您执行 *p(得到 100)和 ++p,将指针设置为过去的 x。

不允许取消引用该指针。也不允许进一步增加它。指针数学在从 [0] 到过去一端的数组范围内是合法的,将单个对象计为 [1] 数组。

底线是在第一次迭代之后任何事情都可能发生。

于 2013-06-30T00:21:05.337 回答
1

操作系统将内存页面映射到大小为 1k 、 4k 8k 等
的进程指针 p 指向映射“页面”中的地址,一旦指针 p 指向的地址超出映射页面,内核就知道你在引用无效内存并因此引发信号。

于 2013-06-30T00:24:14.897 回答