memcpy与startIndex?

时间:2009-07-22 07:31:19

标签: c++ memcpy

我希望从特定起点将特定长度的内容从一个缓冲区复制到另一个缓冲区。我检查了memcpy()但是我只想要指定起始索引时只需要复制内容的长度。

是否有任何功能可以做到这一点,或者有任何好的方法来使用现有的memcpy功能吗?

9 个答案:

答案 0 :(得分:67)

我总是喜欢语法

memcpy( &dst[dstIdx], &src[srcIdx], numElementsToCopy * sizeof( Element ) );

答案 1 :(得分:23)

只需将您想要的偏移量添加到缓冲区的地址即可。

char abuff[100], bbuff[100];
....
memcpy( bbuff, abuff + 5, 10 );

这将从abuff [5]开始复制10个字节到bbuff。

答案 2 :(得分:6)

只需将偏移量添加到地址即可。例如,如果要从第N个字节开始复制缓冲区:

memcpy( destination, source + N, sourceLen - N );

这将复制到destination。如果您还想要偏移目的地 - 将偏移量添加到:

memcpy( destination + N, source + N, sourceLen - N );

答案 3 :(得分:3)

不需要索引,因为您只需按指定的字节数更新源指针即可。以下包装器应该可以解决这个问题

void* memcpy_index(void *s1, const void *s2, size_t index, size_t n) {
  s2 = ((char*)s2)+index;
  return memcpy(s1, s2,n);
}

答案 4 :(得分:1)

只需将指针增加到起始索引即可。

实施例

const unsigned char * src = reinterpret_cast<const unsigned char*>(your source);
unsigned char * dest = reinterpret_cast<unsigned char *>(your dest);
memcpy(dest, src + offset, len);

如何使用STL集合来避免内存访问错误?

答案 5 :(得分:1)

除匿名答案外,此网站还需要一种允许匿名跟进的方法。

为什么我不止一次看到这个疯狂的断言“索引”必须以1个字节为单位?这与惯例完全相反。 “索引”通常是符号的,一种度量,其物理字节偏移量由数组中的元素大小(或向量,甚至可能没有数组的物理布局,但是memcpy()也无关紧要)疗程)。

因此,数组中的第5个元素具有“index”5,但是:

  • 如果数组是char类型,那么“index”的字节偏移量为5。
  • 如果数组类型为short(在x86上),那么“index”的字节偏移量为10.
  • 如果数组类型为int(在x86上),那么“index”的字节偏移量为20.
  • 如果数组是某个大型48字节对象的类型,则该“索引”的字节偏移量为240.

访问该特定元素的正确方法是侧点。重要的是你了解差异,选择一个,并使代码正确。


关于词语的含义,我更愿意阅读:

 void* memcpy_offset(void *s1, const void *s2, size_t offset, size_t n);

比:

 void* memcpy_index(void *s1, const void *s2, size_t index, size_t n);

我发现一个完全通用的void *可能会产生误导性的“索引”。 (虽然我们在这里,“dest”和“source”或“in”和“out”将比“s1”和“s2”更不明确。当您选择不言自明时,代码不需要那么多注释变量名。)

答案 6 :(得分:0)

只需将索引添加到缓冲区的地址,然后将其作为源参数传递给memcpy(),例如:从第3项缓冲区b复制

char a[10], b[20];
::memcpy(a,b+2,10);

还要考虑缓冲区中项目的类型,memcpy()的length(3rd)参数以字节为单位,因此要复制4个int,你应该放入4 * sizeof(int) - 这可能是16(on)一个32位系统。但由于指针算术,类型与起始地址无关:

int a[10], b[10];
::memcpy( a+2, b, 2*sizeof(int) );
// a+2 will be address of 3rd item in buffer a
// not address of 1st item + 2 bytes

答案 7 :(得分:0)

您可以使用以下功能。

template<typename T>
T* memcopy_index(T* dst,T* src,unsigned int index, unsigned int element_count)
{
    return (T*)memcpy(dst,src + index, element_count * sizeof(T));
}

可以使用如下:

int src[]={0,1,2,3,4,5,6};
int dst[15];

memcopy_index(dst,src,2,5);    //copy 5 elements from index 2

您必须确保目标缓冲区有足够的空间来复制元素。

答案 8 :(得分:0)

如果您使用的是c ++,最好使用std :: copy()而不是memcpy()。 std :: copy可以像迭代器一样轻松获取指针。

e.g。

int src[20];
int dst[15];

// Copy last 10 elements of src[] to first 10 elements of dst[]
std::copy( src+10, src+20, dst );

与memcpy()一样,您有责任确保指针有效。

请注意。如果您的使用对性能至关重要,您可能会更快地找到其他答案中详述的memcpy(),但可能不是很多。

相关问题