可以在不取消引用的情况下递增指针,但仍然存在segfault或具有其他(未)定义的恶意

Can incrementing a pointer without dereferencing still segfault or have other (un)defined nastiness?

本文关键字:segfault 存在 其他 定义 恶意 取消 引用 情况下 指针      更新时间:2023-10-16

我在网上找到的所有关于递增指针导致segfault的例子都涉及到指针的取消引用——如果我只想递增它(例如在for循环结束时),而我不在乎它是否会在无效内存中结束,因为我不会再使用它了。例如,在这个程序中,我只需要每次迭代递增4,但在上一次迭代后,我再也不会取消引用这些指针。

float* leftRowPointer, resultRowPointer;
// assume they were correctly initialized
for (unsigned int i = 0; i < 4; ++i, leftRowPointer += 4, resultRowPointer += 4) {
    // do some stuff
}

我需要做这样的事情吗?

for (unsigned int i = 0; i < 4; ++i) {
    // same stuff
    if (i != 3) {
        leftRowPointer += 4;
        resultRowPointer += 4;
    }
}

有没有更好的方法来完成我想要做的事情?

当我自己尝试过的时候,似乎没有什么不好的事情发生,但这很难保证它会一直有效,不幸的是,我在工作中无法使用Valgrind或类似的产品。

我们使用的是C++11标准fwiw,我在其中找不到任何直接适用于此的东西,但我会第一个承认,我对该标准还不够了解,不知道在哪里可以找到它。

第5.7节,"加法运算符",第5段规定了这一点——加法本身的结果是未定义的;即使从不取消引用指针,程序也是无效的。

如果指针操作数和结果都指向相同的数组对象或经过数组对象的最后一个元素的一个数组对象,评估不得产生溢出;否则,行为未定义。

即使允许分段,也极不可能分段,但它仍然没有定义。

如果只是为指针分配无效引用是个问题,那么将指针初始化为NULL也是个问题。所以你的具体问题的答案是否定的。