C ++ memcpy到数组的结尾

时间:2018-03-05 09:40:19

标签: c++ memcpy

我正在尝试将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

3 个答案:

答案 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不会阻止它!