簡體   English   中英

C ++ memcpy到數組結尾

[英]C++ memcpy to end of an array

我試圖將C ++轉換為C#,並且試圖從概念上理解以下代碼的作用:

memcpy( pQuotes + iStart, pCurQuotes + iSrc, iNumQuotes * sizeof( Quotation ) );

pQuotes聲明為: struct Quotation * pQuotes pCurQuotes結構QuoataionCArrayiSrc是它的第一個索引。 iNumQuotespCurQuotes中元素的數量

我想知道的是,如果iStart是pQuotes的最后一個索引,是否會增加pQuotes的大小以容納pCurQuotes中的元素數量? 換句話說,此函數是先調整數組大小然后追加到數組嗎?

謝謝。

SethMo

如果iStart是pQuotes的最后一個索引,是否會增加pQuotes的大小以容納pCurQuotes中的元素數量? 換句話說,此函數是先調整數組大小然后追加到數組嗎?

沒有。

這是這些低級存儲功能的基本限制。 作為開發人員,您有責任確保所有緩沖區都足夠大,以免您在緩沖區外無法讀寫。

從概念上講,這里發生的是程序將只將原始字節從源緩沖區復制到目標緩沖區。 它不執行任何邊界檢查或類型檢查。 對於將其轉換為C#的問題,第二點特別重要,因為在復制過程中沒有調用類型轉換。

是否會增加pQuotes的大小以容納pCurQuotes的元素pCurQuotes

不能。調用方應memcpy進行調用之前確保pQuotes指向足以容納大小為sizeof(Quotation) iStart+iNumQuotes元素的內存塊。

如果使用C#中的數組Quotation[]對這種行為進行建模,則需要將數組擴展為iStart+iNumQuotes元素或更高的大小。

如果使用List<Quotation>對其進行建模,則可以循環調用Add(...) ,並讓List<T>為您處理重新分配。

不,memcpy不會進行任何大小調整 pQuotes僅僅是指向內存中空間的指針,並且指針的類型決定了其大小以用於指針算術。

memcpy所做的只是將n個字節從源復制到目標。 您需要應用一些防御性編程技術來確保您寫的內容不會超出目的地的大小,因為memcpy不會阻止它!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM