2016-04-09 32 views
0

İşte beni şaşırtan C++ kodunun bir parçası.İşaretçi için geçici bir işaretçi nasıl yok edilir?

Bir değişken var, (int *) (& var) var adresini alabilir ve * (int *) (& var) var değerini alabilir. Ancak, var olan bir işaretçi ptr noktası varsa, WHY * (int *) (& ptr) var adresi alamıyor ???

int var = 2; 
cout << "var' address and value: " << &var << " " << var << endl; 
cout << (int*)(&var) << endl; 
cout << *(int*)(&var) << endl; 
cout << (int*)*(int*)(&var) << endl; 


int *ptr = &var; 
cout << "ptr's address: " << &ptr << endl; 
cout << (int*)(&ptr) << endl; 
cout << *(int*)(&ptr) << endl;//NOT var's address, WHY? 
cout << (int*)*(int*)(&ptr) << endl; //var's address, 
cout << *(int*)*(int*)(&ptr) << endl; //var's value, 
+2

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

cevap

0

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.

+0

'size_t' bile çok küçük olabileceğini ve doğru türün intptr_t olduğunu düşünüyorum. –

+0

İlginç, hiç duymadım. Bu yazıdan bahsedeceğim – jpo38