errno_t memcpy_s(void *dest, size_t destSize, const void *src, size_t count);
memcpy_s
函数,从 src 中复制 count 个字节到 dest 中。
这里有一个坑,那就是关于 destSize 和 count 的值,它们都是指的字节数(最开始我以为是元素个数)。
举一个例子,比如我有如下数组:
long src[10] = { 1,2,3,4,5,6,7,8,9,10 };
long dest[10] = { 0 };
现在我将 src 中的元素通过 memcpy_s
函数赋值到 dest 中,最开始我以为 destSize 和 count 表示的是元素个数,于是填写的都是 10,如下。
void Malloc_m_memcopy()
{
long src[10] = { 1,2,3,4,5,6,7,8,9,10 };
long dest[10] = { 0 };
memcpy_s(dest, 10, src, 10);
for (int i = 0; i < 10; i++)
{
printf("%d ", dest[i]); // 1 2 3 0 0 0 0 0 0 0
}
}
显然,printf 打印的数据不正常。因为实际上,destSize 和 count 都是以字节数为单位,而非个数。
所以我们看上面,long 在我的环境中(windows10 64位,vs2015 下)其大小为 4 个字节。所以实际填写的值应该是 destSize 和 count 都为 10 * 4(即 10 个元素,每个元素占用 4 个字节)。
下面是正确的代码:
void Malloc_m_memcopy()
{
long src[10] = { 1,2,3,4,5,6,7,8,9,10 };
long dest[10] = { 0 };
memcpy_s(dest, 10 * 4, src, 10 * 4);
for (int i = 0; i < 10; i++)
{
printf("%d ", dest[i]); // 1 2 3 4 5 6 7 8 9 10
}
}
可以看到正常输出了。
或者你也可以用 sizeof 函数来计算 src 和 dest 占用的元素的字节数
void Malloc_m_memcopy()
{
long src[10] = { 1,2,3,4,5,6,7,8,9,10 };
long dest[10] = { 0 };
memcpy_s(dest, sizeof(dest), src, sizeof(src));
for (int i = 0; i < 10; i++)
{
printf("%d ", dest[i]); // 1 2 3 4 5 6 7 8 9 10
}
}