【发布时间】:2017-02-19 16:33:43
【问题描述】:
如果缓冲区大小足够,在两个不同的结构上调用memcpy 是否会保留原始数据?如果它们各自的数据类型重叠,是否定义为使用先前数据类型的数据检索另一种数据类型的值?
这对于两种 c/cpp 语言应该是相似的,但我在 cpp 中提供了一个示例 -
#include <iostream>
#include <cstring>
using namespace std;
struct A{
int a;
char b[10];
};
struct B{
int ba;
int bb;
};
int main(){
B tmp;
tmp.ba = 50;
tmp.bb = 24;
cout << tmp.ba << tmp.bb << "\n";
// everything is fine yet
A obj;
memcpy(&obj, &tmp, sizeof(tmp));
// 1. is this valid?
cout << obj.a << "\n";
B newB;
memcpy(&newB, &obj, sizeof(newB));
// 2. Are these valid?
cout << newB.ba << newB.bb << "\n";
}
在上面的示例中,我已经评论了第 1 条和第 2 条评论,它们是否有效并且如果提供了足够的缓冲区,数据是否会保留?我们可以便携吗?
结构和其他相关函数在 C 库中,但我们将使用 c++ 进行编译。
【问题讨论】:
-
memcpy既不知道也不关心数据类型。它复制您指定的字节数,无论目标缓冲区是否足够大。当范围重叠时,行为是 undefined 并且应该使用memmove。 -
memcpy()对底层数据类型不做任何保证。 -
C 还是 C++?这是两种不同的语言,具有完全不同的对象模型。
-
@BaummitAugen 不同意 memcpy 结束 obj 的生命周期
-
@user6241591 要从 C++ 程序中使用 C 库,您应该使用 C 编译器编译库,并使用链接器组合部件