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