繁体   English   中英

在迭代数组时增加指向数组的指针时,不安全代码是否越界?

[英]Does unsafe code go out of bounds when incrementing a pointer to an array while iterating through the array?

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

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 次这样的代码,但从未遇到过问题,但仍然如此?

该代码并非不安全。 唯一的问题是data分配失败。 由于n始终是data的长度,因此有人无法将i移出写入范围 - 您的循环仅取决于n的值。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM