我正在尝试将C ++翻译成C#,并且我试图从概念上理解以下代码的作用:
memcpy( pQuotes + iStart, pCurQuotes + iSrc, iNumQuotes * sizeof( Quotation ) );
宣布pQuotes: struct Quotation * pQuotes 。 pCurQuotes 是 struct Quoataion 的 CArray , iSrc 是它的第一个索引。 iNumQuotes 是 pCurQuotes 中元素的数量。
我想知道的是,如果iStart是pQuotes的最后一个索引,是否会增加pQuotes的大小以容纳pCurQuotes中的元素数量?换句话说,这个函数是否正在调整数组大小然后附加到它?
感谢。
SethMo
答案 0 :(得分:2)
如果iStart是pQuotes的最后一个索引,pQuotes的大小是否为 增加以容纳pCurQuotes中的元素数量?在 换句话说,这个函数是否正在调整数组大小然后附加到它?
没有
这是这些低级记忆功能的基本限制。作为开发人员,您有责任确保所有缓冲区都足够大,以便您永远不会在缓冲区外读取或写入。
从概念上讲,这里发生的是程序只将原始字节从源缓冲区复制到目标缓冲区。它不执行任何边界或类型检查。对于将其转换为C#的问题,第二点特别重要,因为在复制过程中没有调用类型转换。
答案 1 :(得分:1)
是否会增加
pQuotes
的大小以容纳pCurQuotes
中的元素数量?
没有。调用者应确保在调用memcpy
之前 pQuotes
指向足以容纳iStart+iNumQuotes
大小sizeof(Quotation)
个元素的内存块}}
如果使用C#中的数组Quotation[]
对此行为进行建模,则需要将数组扩展为iStart+iNumQuotes
元素或更高的大小。
如果您使用List<Quotation>
对其进行建模,则可以在循环中调用Add(...)
,并让List<T>
为您处理重新分配。
答案 2 :(得分:1)
不,memcpy不会调整大小。 pQuotes只是指向内存空间的指针,指针类型决定了指针算术的大小。
memcpy所做的就是将n个字节从源复制到目标。您需要应用一些防御性编程技术,以确保您不会超出目的地的大小,因为memcpy不会阻止它!