首页 > 解决方案 > 在遍历数组时递增指向数组的指针时,不安全的代码是否会越界?

问题描述

我正在处理图像和视频操作,在某些情况下确实需要不安全的代码来提高速度。有时我使用如下代码:

var data = new byte[n];

fixed (byte* fixData = data)
{
    byte* ptrData = &fixData[0];

    for (int i = 0; i < n; i++)
    {
        *(ptrData++) = 42;
    }
}

我的问题是,由于ptrData是递增的n时间,它最终指向数组之外,但这是一个问题吗?当然,它从来没有被分配任何东西,因为增量发生在最后一次赋值之后,但是这段代码是否仍然会破坏某些东西,如果是这样,有多严重?我已经运行了 1_000 次这样的代码并且从未遇到过问题,但仍然如此吗?

标签: c#unsafe

解决方案


该代码并非不安全。唯一的问题是分配失败data。因为n总是data有人无法i越界写的长度 - 你的循环只取决于n.

在循环结束时,如果您要写入数据i >= n,则会产生越界写入。因此,您必须问自己:您的程序是否可能会受到影响以在最后写入额外的值?如果是,则您的数据不安全。如果没有,你很好。

导致缓冲区溢出的问题不是索引超过长度;问题是一旦发生这种情况,代码就会继续编写。您进入一个状态,i >= n但这只是循环结束后的状态。i可能是任何可能的值,您没有理由关心,因为您不再使用该值。


推荐阅读