[英]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.