C ++ memcpy到数组的结尾

问题描述 投票:0回答:3

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

c++ memcpy
3个回答
2
投票

如果iStart是pQuotes的最后一个索引,那么pQuotes的大小是否会增加以适应pCurQuotes中的元素数量?换句话说,这个函数是否正在调整数组大小然后附加到它?

没有。

这是这些低级记忆功能的基本限制。作为开发人员,您有责任确保所有缓冲区都足够大,以便您永远不会在缓冲区外读取或写入。

从概念上讲,这里发生的是程序只将原始字节从源缓冲区复制到目标缓冲区。它不执行任何边界或类型检查。对于将其转换为C#的问题,第二点特别重要,因为在复制期间没有调用类型转换。


1
投票

是否会增加pQuotes的大小以容纳pCurQuotes中的元素数量?

没有。在打电话给memcpy之前,调用者应该确定pQuotes指向一个足以容纳iStart+iNumQuotes大小的sizeof(Quotation)元素的内存块。

如果使用C#中的数组Quotation[]对此行为进行建模,则需要将数组扩展为iStart+iNumQuotes元素或更高的大小。

如果你用List<Quotation>建模它,你可以在一个循环中调用Add(...),让List<T>为你处理重新分配。


1
投票

不,memcpy不做任何调整大小。 pQuotes只是指向内存空间的指针,指针的类型决定了指针算术的大小。

memcpy所做的就是将n个字节从源复制到目标。您需要应用一些防御性编程技术,以确保您不会超出目的地的大小,因为memcpy不会阻止它!

© www.soinside.com 2019 - 2024. All rights reserved.