为什么在增加指针的整数值时会得到一个随机数?

Ale*_*den 0 c++ int pointers memory-address

我是一名专业的 C# 程序员,但我对 C++ 很陌生。我对指针的基本概念很好,但我一直在玩。您可以通过将指针转换为 来获取指针的实际整数值int

int i = 5;
int* iptr = &i;
int ptrValue = (int)iptr;
Run Code Online (Sandbox Code Playgroud)

这是有道理的;这是一个内存地址。但是我可以移动到下一个指针,并将其转换为int

int i = 5;
int* iptr = &i;
int ptrValue = (int)iptr;
int* jptr = (int*)((int)iptr + 1);
int j = (int)*iptr;
Run Code Online (Sandbox Code Playgroud)

我得到了一个看似随机的数字(虽然这不是一个好的 PSRG)。这个数字是多少?它是同一进程使用的另一个号码吗?它可能来自不同的过程吗?这是不好的做法,还是不允许的?如果没有,这有什么用吗?这有点酷。

rig*_*old 5

这个数字是多少?它是同一进程使用的另一个号码吗?它可能来自不同的过程吗?

您通常不能将指针转换为整数并返回并期望它们是可取消引用的。整数就是数字。指针就是指针。它们是完全不同的抽象并且不兼容。

如果整数不够大,无法存储指针的内部表示(很可能是这种情况;整数通常为 32 位长,指针通常为 64 位长),或者如果您在将整数转换回之前修改了整数指针,您的程序表现出未定义的行为,因此任何事情都可能发生。

请参阅C++:将指针转换为 int 并稍后再转换回指针是否安全?

这是不好的做法,还是不允许的?

不允许?不。
不好的做法?可怕的做法。


归档时间:

查看次数:

285 次

最近记录:

6 年,1 月 前