C++ C++;递增指向未知内存区域的指针

C++ C++;递增指向未知内存区域的指针,c++,memory,pointers,C++,Memory,Pointers,我对C/C++处理盲目递增指针的行为提出了质疑 因此,我有一个指向int的指针作为函数的参数 func(int*thePointer){… 在这个函数中有一个循环 while(*thePointer) { ++thePointer; } 我知道,只要内存中有int,循环就会继续,但如果内存属于另一种内存类型的一部分,会怎么样?比如说,你增加到double的前4个字节。在这种情况下,int是否仍然有值/循环是否会继续 免责声明:我知道这很可能是不好的做法。这纯粹是一个学术问题 但是,如果

我对C/C++处理盲目递增指针的行为提出了质疑

因此,我有一个指向int的指针作为函数的参数

func(int*thePointer){…

在这个函数中有一个循环

while(*thePointer) {
    ++thePointer;
}
我知道,只要内存中有
int
,循环就会继续,但如果内存属于另一种内存类型的一部分,会怎么样?比如说,你增加到
double
的前4个字节。在这种情况下,int是否仍然有值/循环是否会继续

免责声明:我知道这很可能是不好的做法。这纯粹是一个学术问题

但是,如果内存属于另一种内存类型的一部分,那该怎么办呢?比如说,你增加到double的前4个字节。int是否仍然有值/在这种情况下循环是否继续

编译器不关心内存的类型。你可以增加到你选择的任何类型的内存中,这样就可以了

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


只要该位置的内存属于您(即:您的程序分配的内存),您可以设置它。也就是说,如果内存位置不是您正在处理的整数值,您很可能会损坏其他对象的状态,这最终会导致不好的事情发生。

如果您继续递增,最终您将获得SIGSEGV或Windows道德等效值。但是,在当你到达那里时,你很可能会像库克一样参观虚拟机中的其他东西。其他变量,废弃的三明治包装,等等


像这样的循环不仅仅是“不好的实践”,它们是漏洞利用的主要来源。

在内存中没有intdouble之类的东西。内存只是内存:字节的占位符

因此,如果您不断增加指向int的指针,您将指向内存中的下四个字节,就是这样。如果您试图通过指向整数的指针使用内存的这一部分,您可能会将其内容视为int


最后,您将指向未分配给进程的内存区域,程序将以分段错误退出。上面的代码与内存中有多少
int
无关。您的代码将一直运行,直到找到与设置为零的整数等价的值


是的,这是一种非常糟糕的做法。结果是未定义的。您很可能遇到不属于预期阵列的内存。而且您很有可能进入内存导致处理器故障。

我加入了所有人的行列。考虑到这一点,即使出于学术目的,也会为魔鬼打开大门。重点是无论内存中有什么内容,er都会每次提升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的数组的元素 作为其元素的对象的类型 类型

当一个表达式 整数类型被添加到或 从指针中减去,结果为 具有指针操作数的类型。 如果指针操作数指向 数组对象的元素,以及 数组足够大,结果 指向一个元素,该元素相对于 原始元素,使 函数下标的差异 结果和原始数组元素 等于积分表达式 换句话说,如果表达式P 指向数组的第i个元素 对象,表达式(P)+N (相当于N+(P))和(P)N(其中 N的值N)指向, 分别是i+n和i–n 数组对象的元素,已提供 它们是存在的。而且,如果 表达式P指向最后一个 数组对象的元素 表达式(P)+1点,超过 数组对象的最后一个元素,以及 如果表达式Q指向一个过去 数组对象的最后一个元素, 表达式(Q)1指向最后一个 数组对象的元素。如果两者都是 指针操作数和结果 指向同一数组的元素 对象,或超过最后一个元素 在数组对象的 不得产生溢流; 否则,行为是未定义的


恶魔会从你的鼻子里飞出来。盲目地增加指针是一种很有可能的错误做法…大声说出来,然后读两遍:早上你会感觉好些。-1:不是真的。增加超过对象的结尾(并访问内存读/写)结果为UB。如果对象是一个整数的地址,则任何增量都会超出。如果地址指向数组,则会超出数组的末尾。实际指向数组之外的下一个元素(不访问)是有效的。事实上,这正是向量的迭代器正在运行。Keith的语句敲响了一个钟声——有效的方法是从数组的末尾算起,但通常递增指针并不保证安全:可能有(或曾经有过)内存模型中,某些CPU的寄存器无法在特定范围外递增,可能是由于奇怪的分段处理规则等原因。@Reed:“内存属于您……能够设置它”不是真的-内存可以映射为