Выполняет ли вызов memcpy
на двух разных структурах, сохраняя исходные данные, если размер буфера достаточен? И определено ли это для получения значений другого типа данных с данными предыдущего типа данных, если их соответствующие типы данных перекрываются?Сохраняет ли memcpy данные между различными типами?
Это должно быть одинакова для обоих языков с/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++? Это два разных языка с совершенно другой объектной моделью. –