使用具有数组名称的memcpy

Using memcpy with array name

本文关键字:memcpy 数组      更新时间:2023-10-16

可能重复:
C: 为什么会有一个数组';s地址等于它的值?

我最近在我的项目中发现了用数组名的地址调用memcpy的代码

int a[10];
memcpy(&a, &b ,sizeof(a));

令人惊讶的是(对我来说)它似乎奏效了。

我应该把它改成memcpy(a,b,sizeof(a));吗?

C++规范允许这样做吗?有人能给我指一下关于这种行为的资源吗?有陷阱吗?

我还检查了

assert((void*)&a == (void*)a);

并且CCD_ 3确实与CCD_。

我在VS2005、VS2008和VS2010中验证了此行为。

&a是数组的地址;CCD_ 6可以被隐式地转换为第一元素的地址。两者都有相同的地址,因此在转换为void*时都会给出相同的值。

有陷阱吗?

memcpy不是类型安全的,所以编写可编译但行为不好的代码非常容易;例如,如果a是指针而不是数组,那么sizeof a将进行编译,但给出了错误的值。C++的类型安全模板可以防止这种情况:

std::copy(b, std::end(b), a); // will only compile if `b` has a known end.

数组的名称计算为数组开头的地址,因此两者具有相同的含义。请参阅数组的由来';s地址等于它在C中的值?(这是一个C问题,但C++也是如此)。

就像你说的,这并不重要。

当作为参数传递时,数组的名称将"衰减"为指向其第一个元素的指针。

是的,数组的地址与其第一个元素的地址相同
因此,无需更改memcpy调用。除非您担心以后数组的定义可能会更改为指针(如int* a = new int[10];)。

当然,如果您无论如何都要对程序进行更改,那么最好放弃整个memcpy,而使用真正的C++。