#include <iostream>
#include <string>
#include <iomanip>
#include <cstring>
using namespace std;
bool is_aligned ( char * p) {
return reinterpret_cast < unsigned long long > ( p) % alignof( int ) == 0 ;
}
void dump( const string & message, char * p, size_t s) {
cout << message << hex;
for ( int i= 0 ; i< s; i++ ) cout << ( int ) p[ i] << " " ; cout << endl;
cout << dec;
}
int main( ) {
int x = 27 ;
char w;
char z [ sizeof ( int ) * 10 + 1 ] ;
char y;
// check conditions
cout << " " << alignof( x) << " " << alignof( y) << " " << alignof( z) << endl;
cout << " " << & x << " " << ( void * ) & y << " " << ( void * ) z<< endl;
char * p = z + is_aligned( z) ; // never aligned unless int is aligned on 1
cout << "Is z aligned for int ? " << ( is_aligned( z) ? "yes" : "no" ) << endl;
cout << "Is p aligned for int ? " << ( is_aligned( p) ? "yes" : "no" ) << endl;
// memcpy option
memcpy ( p, & x, sizeof ( x) ) ; // test
dump ( "Int stored with memcpy: " , p, sizeof ( int ) ) ;
x= 0 ;
memcpy ( & x,p, sizeof ( x) ) ;
memset ( p, 0 , sizeof ( x) ) ;
cout << "restored: " << x<< endl;
// reinterpret cast option:
cout << "Going to store with reinterpret cast." << endl;
* reinterpret_cast < int * > ( p) = x; //ouch
dump ( "Int stored with reinterpret cast: " , p, sizeof ( int ) ) ;
x= 0 ;
cout << "Going to restore with reinterpret cast." << endl;
x = * reinterpret_cast < int const * > ( p ) ;
cout << "restored: " << x<< endl;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGNzdHJpbmc+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpib29sIGlzX2FsaWduZWQgKGNoYXIgKnApIHsKCXJldHVybiByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4ocCklYWxpZ25vZihpbnQpPT0wOwp9CnZvaWQgZHVtcChjb25zdCBzdHJpbmcgJm1lc3NhZ2UsIGNoYXIgKnAsIHNpemVfdCBzKSB7Cgljb3V0IDw8IG1lc3NhZ2UgPDwgaGV4OyAKCWZvciAoaW50IGk9MDsgaTxzOyBpKyspIGNvdXQ8PCAoaW50KSBwW2ldPDwiICI7IGNvdXQ8PGVuZGw7Cgljb3V0PDxkZWM7IAp9CgppbnQgbWFpbigpIHsKCWludCB4ID0gMjc7IAoJY2hhciB3OwoJY2hhciB6IFtzaXplb2YoaW50KSoxMCsxXTsKCWNoYXIgeTsgCgkKCS8vIGNoZWNrIGNvbmRpdGlvbnMgCgkKCWNvdXQgPDwgIiAiPDwgYWxpZ25vZih4KSA8PCAiICI8PCBhbGlnbm9mKHkpIDw8ICIgIjw8IGFsaWdub2Yoeik8PGVuZGw7IAoJY291dCA8PCAiICI8PCAmeCA8PCAiICI8PCAodm9pZCopJnkgPDwgIiAiPDwgKHZvaWQqKSB6PDxlbmRsOyAKCWNoYXIgKnAgPSB6ICsgaXNfYWxpZ25lZCh6KTsgICAgLy8gbmV2ZXIgYWxpZ25lZCB1bmxlc3MgaW50IGlzIGFsaWduZWQgb24gMQoJY291dCA8PCAiSXMgeiBhbGlnbmVkIGZvciBpbnQgPyAiIDw8IChpc19hbGlnbmVkKHopID8ieWVzIjoibm8iKSA8PGVuZGw7Cgljb3V0IDw8ICJJcyBwIGFsaWduZWQgZm9yIGludCA/ICIgPDwgKGlzX2FsaWduZWQocCkgPyJ5ZXMiOiJubyIpIDw8ZW5kbDsKCQoJLy8gbWVtY3B5IG9wdGlvbiAKCW1lbWNweSAocCwgJngsIHNpemVvZih4KSk7IC8vIHRlc3QKCWR1bXAgKCJJbnQgc3RvcmVkIHdpdGggbWVtY3B5OiAiLCBwLCBzaXplb2YoaW50KSk7ICAKCXg9MDsgCgltZW1jcHkgKCZ4LHAsIHNpemVvZih4KSk7IAoJbWVtc2V0KHAsIDAsIHNpemVvZiAoeCkpOwkKCWNvdXQgPDwgInJlc3RvcmVkOiAiPDx4PDxlbmRsOyAKCQoJLy8gcmVpbnRlcnByZXQgY2FzdCBvcHRpb246IAoJY291dCA8PCAiR29pbmcgdG8gc3RvcmUgd2l0aCByZWludGVycHJldCBjYXN0LiI8PGVuZGw7IAoJKnJlaW50ZXJwcmV0X2Nhc3Q8aW50Kj4ocCkgPSB4OyAgIC8vb3VjaCAKCWR1bXAgKCJJbnQgc3RvcmVkIHdpdGggcmVpbnRlcnByZXQgY2FzdDogIiwgcCwgc2l6ZW9mKGludCkpOyAgCgl4PTA7IAoJY291dCA8PCAiR29pbmcgdG8gcmVzdG9yZSB3aXRoIHJlaW50ZXJwcmV0IGNhc3QuIjw8ZW5kbDsgCgl4ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8aW50IGNvbnN0Kj4oIHAgKTsKCWNvdXQgPDwgInJlc3RvcmVkOiAiPDx4PDxlbmRsOyAKCQoJcmV0dXJuIDA7Cn0=