可以递增指针而不解除引用仍然是段错误或具有其他(未)定义的恶意吗?

Dan*_*nno 8 c++ pointers memory-management segmentation-fault undefined-behavior

我在网上找到的关于递增指针导致段错误的所有例子都涉及指针的取消引用 - 如果我只想增加它(例如在for循环结束时),我不会如果它最终在无效的内存中,因为我不会再次使用它.例如,在这个程序中我只需要每次迭代一步一步,但是在最后一次迭代之后我再也没有取消引用这些指针.

float* leftRowPointer, resultRowPointer;
// assume they were correctly initialized

for (unsigned int i = 0; i < 4; ++i, leftRowPointer += 4, resultRowPointer += 4) {
    // do some stuff
}
Run Code Online (Sandbox Code Playgroud)

我需要做这样的事吗?

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

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

当我自己尝试时,似乎没有什么不好的事情发生,但这并不能保证它会一直有效,不幸的是我在工作中无法访问Valgrind或类似的东西.

我们正在使用C++ 11标准,fwiw,我找不到任何直接适用于此的内容,但我会是第一个承认我不太了解标准的人知道在哪里寻找它.

mol*_*ilo 8

第5.7节"添加剂操作符"第5段规定了这一点 - 添加本身的结果是不确定的; 即使您从未取消引用指针,该程序也无效.

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

即使它被允许,它也不太可能出现段错误,但它仍然是未定义的.