[英]C++ memcpy to end of an array
我試圖將C ++轉換為C#,並且試圖從概念上理解以下代碼的作用:
memcpy( pQuotes + iStart, pCurQuotes + iSrc, iNumQuotes * sizeof( Quotation ) );
pQuotes聲明為: struct Quotation * pQuotes 。 pCurQuotes是結構Quoataion的CArray , iSrc是它的第一個索引。 iNumQuotes是pCurQuotes中元素的數量 。
我想知道的是,如果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.