簡體   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