我是一位C#专家,但是我对C ++还是很陌生。我对指针的基本想法很好,但是我一直在玩。您可以通过将指针转换为int
来获得指针的实际整数值:
int i = 5; int* iptr = &i; int ptrValue = (int)iptr;
这有道理;这是一个内存地址。但是我可以移至下一个指针,并将其转换为
int
:
int i = 5; int* iptr = &i; int ptrValue = (int)iptr; int* jptr = (int*)((int)iptr + 1); int j = (int)*iptr;
而且我得到一个看似随机的数字(尽管这不是一个好的PSRG)。这个数字是多少是同一过程使用的另一个数字吗?是否可能来自其他过程?这是不好的做法,还是不允许的?如果没有,有没有用?有点酷。
我是一位C#专家,但是我对C ++还是很陌生。我对指针的基本想法很好,但是我一直在玩。您可以通过将指针转换为int来获得指针的实际整数值:...
这个数字是多少?是同一过程使用的另一个数字吗?是否可能来自其他过程?
您超出i
指针4或8个字节,并打印出该数字,该数字可能是存储在程序空间中的另一个数字。该值是未知的,这是未定义行为。另外,您很有可能会遇到错误(这意味着您的程序可能会崩溃)[您听说过SIGSEGV吗?细分违规问题]
您定义一个整数依据
使用指针指向随机地址是非常危险的。除非您知道自己在做什么,否则请勿指向地址。您可以覆盖它的内容,也可以尝试修改常量以导致不确定的行为...
您发现内存中的随机位置包含“未知”数据。不仅如此,而且您可能会发现自己指向的内存是您的进程没有“权利”的,因此即使读取地址内容的行为也可能导致分段错误。
这不是“随机”。这只是意味着下一个地址上有一些数据。
int i = 5;
int* iptr = &i;
int ptrValue = (int)iptr;
int* jptr = (int*)((int)iptr + 1);
int j = (int)*iptr;