Eğer bir int
bir gösterici döküm sırf var, yazma WhozCraig olduğunu. Eğer bir 32 bit makinede çalışıyorsanız, bu hiç işe yaramıyor olsa bile, iyi çalışabilir (çünkü işaretçiler 8 bayt ve int
'dadır). Ancak 64 bit makinede, (int*
, void*
) 8 bayt, int
ise 4 bayt kullanır. Ben yayınlanmıştır olarak (int
kullanarak) programını çalıştırdığınızda
Ben bir 64bits makineyi kullanıyorum göstermek için, ben alıyorum:
var' address and value: 0x7ffd12c3dbd4 2
0x7ffd12c3dbd4
2
0x2
ptr's address: 0x7ffd12c3dbd8
0x7ffd12c3dbd8
314825684
0x12c3dbd4
Segmentation fault
ben değiştirdiğinizde üzerinde 64bit olan size_t
bütün int
(benim
size_t var = 2;
cout << "var' address and value: " << &var << " " << var << endl;
cout << (size_t*)(&var) << endl;
cout << *(size_t*)(&var) << endl;
cout << (size_t*)*(size_t*)(&var) << endl;
size_t *ptr = &var;
cout << "ptr's address: " << &ptr << endl;
cout << (size_t*)(&ptr) << endl;
cout << *(size_t*)(&ptr) << endl;// var's address, OK
cout << (size_t*)*(size_t*)(&ptr) << endl; //var's address,
cout << *(size_t*)*(size_t*)(&ptr) << endl; //var's value, OK
alıyorum:
var' address and value: 0x7ffd5c258de0 2
0x7ffd5c258de0
2
0x2
ptr's address: 0x7ffd5c258de8
0x7ffd5c258de8
140726149418464
0x7ffd5c258de0
2
makine ve 32bit makinede 32bit) olacaktır 10
Artık bölümleme hatası yok ve *(size_t*)(&ptr)
, 'a eşit olan 140726149418464
bildiriyor.
Düzeltme: bkz. Marian Spanik yorumu, size_t
'dan başka uygun türde olabilir. Ama emin olan, bu int
uygun değil.
Kafanızı karıştırmanın bir sebebi, önemli kısımlarının hiçbir anlam ifade etmemesidir. '(int *) * (int *) (& ptr)' ?? Yani, bir int **, int '', int '' için dereferans, o zaman int '' için bunu yapmak için, onu int ''. Bunun, “int” ve “void *” in aynı boyutta olmadığı bir platformda çalışmasıyla sonuçlanacak kaos. – WhozCraig