使用具有数组名称的memcpy
Using memcpy with array name
可能重复:
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++。
相关文章:
- 使用 memcpy 函数C++复制字符数组
- 使用memcpy复制C++中的N-D数组
- 使用 memcpy 在数组内部复制的 C++
- 为什么当我想将(使用 memcpy)结构数组复制到字符数组时,字符数组为空
- 使用memcpy将浮点数组复制到uint8_t的数组是否有效
- std::memcpy结构,具有TriviallyCopyable类型T的紧密封装成员到T的数组,反之亦然
- 使用 memcpy 将动态数组的内容复制到另一个动态数组上会产生运行时错误
- 为什么 Memcpy 会改变字符串数组
- 如何从原始数组到std::vector执行memcpy等效操作
- memcpy 问题 -> 尝试复制结构数组
- 我需要以相反的方式复制一个长整型数组,我需要系统函数,例如 memcpy 有没有
- 在 C++ 中使用 Memcpy 将结构写入 char 数组
- 如何使用 memcpy 将数据从两个整数复制到字符数组
- 构造函数中对整数数组的memcpy()操作在C++中给出了意外的输出
- 使用memcpy移动数组并在给定位置插入一个新元素
- 数组中的Memcpy只能正常工作1/20个实例
- 为什么将字符数组复制到结构中时 memcpy 不起作用?
- 如何将char数组作为对函数的引用并在中传递memcpy
- 从char数组将memcpy转换为结构
- Pod 到 Array 的结构的 memcpy 数组