C++增加一个指针到未知的内存区域

问题描述:

我有一个关于C/C++处理盲目递增指针的行为的查询。C++增加一个指针到未知的内存区域

所以,我有一个指针为int作为参数传递给函数

func(int* thePointer) {...

和我有一个功能

while(*thePointer) { 
    ++thePointer; 
} 

我明白,只要有内环路是int在超出此指针的内存中循环将继续,但如果内存属于另一种内存类型的一部分呢?假设你增加到double的前4个字节。在这种情况下,int仍然会有一个值/会继续循环吗?

声明:我知道这是非常可能的不良做法。这是一个纯粹的学术问题。

+8

恶魔会飞出你的鼻子。 – 2011-02-18 02:40:10

+1

盲目增加一个指针是一种非常非常可能的不良做法......说出来大声,然后阅读两遍:http://www.cplusplus.com/doc/tutorial/pointers/,你会感觉更好早上。 – AJG85 2011-02-18 03:11:04

内存中没有这样的东西,如int。内存只是内存:占位符的字节。

因此,如果您不断增加指向int的指针,您将指向内存中接下来的四个字节,就是这样。如果您尝试通过指向整数的指针来使用该部分内存,则可能将其内容看作是int

最终,您将指向未分配给您的进程的内存区域,并且程序将以分段错误退出。

但如果内存属于另一种内存类型的一部分呢?假设你增加到双精度的前4个字节。在这种情况下,int仍然会有一个值/会继续循环吗?

编译器不关心那里有什么类型的内存。你可以增加到你选择的任何类型的内存,它会很好。

只有当您尝试访问那个内存位置时才会有问题。如果你试图在指针位置设置一个值,但它不是分配给你的进程的内存,它会崩溃。

只要该位置的内存属于您(即:您的程序分配了它),您就可以对其进行设置。话虽如此,如果内存位置不是你被视为整数值的东西,那么你很可能会破坏其他对象的状态,最终会导致不好的事情发生。

+2

-1:不正确。增加超过一个对象的末尾(并访问内存读/写)导致UB。如果对象是一个int的地址,那么任何增量都会超出。如果地址指向一个数组,然后移动到数组的最后。 – 2011-02-18 02:54:11

+1

实际上,在数组之外的下一个元素上指向(不访问)是有效的。实际上,这正是`vector `的`end()`迭代器正在做的事情。 – Keith 2011-02-18 03:10:21

如果你不断增加,最终你会得到一个SIGSEGV或Windows道德等价物。但是,在你到达那里之前,你很可能会在虚拟机中进行一次库克之旅。其他变量,废弃的三明治包装纸,无论如何。

这样的循环不仅仅是“不好的做法”,它们是利用的主要来源。

您上面的代码与内存中有多少个int无关。您的代码会一直发现,直到找到等于零的整数。

是的,这是非常糟糕的做法。结果是不确定的。你很可能会遇到不属于预期数组的部分。而且你很有可能进入内存导致处理器故障。

我加入大家。即使有学术目的,这样做也是为魔鬼打开了大门。无论内存中的内容如何,​​指针都会每次提前int的大小。访问时你会得到垃圾。

如果访问内存(读取或写入),移动指针是危险的。

将指针移到当前对象的末尾并取消引用该对象是未定义的行为。

单一对象:

int x; 
int* xp = &x; 

xp++; // Now pointing past the object. 
int y = *xp; // Undefined behavior. 

阵:

int x[10]; 
int xp = x; 

while(*xp) 
{ ++xp; // Works fine the first 9 times. 
}   // After that it is UB to access the memory pointed at by xp 

注:循环

while(*xp) // This continues while the memory pointed at 
      // is not zero. As soon as a zero is found in memory 
      // the loop exits. 

ISO 14882,第5.7节:

$ 4对于这些运算符而言,指向非数组对象的指针 的行为与指向长度为1的数组的第一个 元素的指针相同,该对象的类型为元素 类型。

$ 5当具有 积分类型的表达式被添加到或从 指针中减去,结果 具有指针操作数的类型。 如果指针操作数指向数组对象的 元件,并且 阵列足够大,结果 指向一个元件从 原始元件偏移,使得所述 的下标的 差得到和原始数组元素 等于积分表达式。换言之,如果表达式P 指向数组 对象的第i个元素,则表达式(P)+ N (等同地,N +(P))和(P)N(其中N + )指向,分别为 ,这个数组对象的第i + n个和第i个 元素,提供 它们存在。此外,如果 公式P指向数组对象的最后 元件,所述 表达(P)1点中的一个过去的数组对象的 最后一个元素,和 如果表达式Q点的一个过去 最后数组对象的元素, 表达式(Q)1指向数组对象的最后一个 元素。如果两个 指针操作数和结果 指向相同的阵列 对象的元素,或一个过去的最后一个元素的数组对象 ,评价 不得产生溢出; 否则,行为是不确定的。