L'appel memcpy
sur deux structures différentes conserve-t-il les données d'origine si la taille de la mémoire tampon est suffisante? Et est-il défini pour récupérer les valeurs d'un autre type de données avec les données du type de données précédent si leurs types de données respectifs se chevauchent?Memcpy conserve-t-il les données entre différents types?
Cela devrait être similaire pour les deux c/langues cpp mais je fournir un exemple dans 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";
}
Dans l'exemple ci-dessus, je l'ai commenté 1er et 2ème commentaire, sont-ils valides et les données conservées si une zone tampon suffisante est fournie? Pouvons-nous le faire de façon portative?
La structure et les autres fonctions qui s'y rapportent sont en bibliothèque C mais nous allons l'utiliser et le compiler avec C++.
'memcpy' ne connaît ni ne se soucie du type de données. Il copie le nombre d'octets que vous spécifiez, que le tampon de destination soit suffisamment grand ou non. Lorsque les plages se chevauchent, le comportement est * non défini * et "memmove" doit être utilisé. –
'memcpy()' ne garantit rien concernant les types de données sous-jacents. –
C ou C++? Ce sont deux langues différentes avec un modèle d'objet complètement différent. –