c# - 在遍历数组时递增指向数组的指针时,不安全的代码是否会越界?
问题描述
我正在处理图像和视频操作,在某些情况下确实需要不安全的代码来提高速度。有时我使用如下代码:
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
可能是任何可能的值,您没有理由关心,因为您不再使用该值。
推荐阅读
- javascript - angular 5+ implement smart-app-banner vanilla JS
- ruby-on-rails - 在 cloud9 中,当我使用 'rails s' 时会出现此错误。它是什么?
- docker - How to add a docker container to a running kubernetes pod?
- ios - WKWebView 对 503 错误没有反应
- django - Django 如何自动获取用户的 ID?
- xml - 使用 StaX 忽略评论
- tsql - 当其他视图依赖于它时如何使用 SCHEMABINDING 更改视图
- azure - Application Insight 如何自动捕获传入的 HttpRequest?
- angular - 等待一段时间后显示微调器
- javascript - Axios 使用 React 自动刷新