Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

C++ pointer to pointer problemi


senko

Öne çıkan mesajlar

cpp guruları şu aşağıdaki duruma hiç kafam basmadı bir bakabilirmisiniz siz


using namespace std;

typedef int T;

int main(int argc, char** argv) {

const T t = 12345;
T *pt;
const T **ppt = (const T**)&pt;
*ppt = &t;
*pt = 54321;
cout<<t<<endl;

const T *pct = &t;
cout<<t<<endl;
cout<<*pct<<endl;


return 0;
}


şimdi burda ilk anda 12345 basıyor da ikincisinde yani gidip *pct'yi bastırdığımız 54321 basıyor fikri olan var mı?
hepsi nihayetinde t adlı variable'ye ulaşmıyor mu?
Link to comment
Sosyal ağlarda paylaş

ya işte comp ne yapiyor çözemedim
acaba o t değerinin bir kopyasını mı çıkarıyor

const T **ppt = (const T**)&pt;

şu satırın da hatalı olması lazım bir de
2. ve daha üstün leveldaki pointerlarda normal bir değeri const'a atayamamız lazım aslında, ama buna da izin veriyor. zaten (const T**) zorlamayınca izin vermedi :)
Link to comment
Sosyal ağlarda paylaş

evet
şöyle diyelim t yi compiler optimizasyon için belli bir yerde tutuyor. (Const dediğine göre bunu kullanma ihtimali yüksek gibi düşünüp)

sende arkalardan asıl memorydeki yerini trollüyorsun. Ama compiler hiç bakmıyor o yere çünkü değişmeyecek diye düşünüyor.

Dediğim gibi kodu


using namespace std;

typedef int T;

int main(int argc, char** argv) {

volatile const T t = 12345;
volatile T *pt;
volatile const T **ppt = (volatile const T**)&pt;
*ppt = &t;
*pt = 54321;
cout<<t<<endl;

volatile const T *pct = &t;
cout<<t<<endl;
cout<<*pct<<endl;


return 0;
}


çevir o zaman bak değerlere
Link to comment
Sosyal ağlarda paylaş

şimdi normalde const degerleri hiçbir şekilde degismemesi gerek.
ama böyle pointer aracılığı ile dolaylı yoldan degerini degistirebiliyoruz.
(bundan sonrası tahmin) bence yeni compilerlar bu çakallıgı engellemek için const degerleri ayrıcana tutuyor bir yerde sonradan degistirmeleri engellemek için. yani eski compilerlar ile degisik sonuçlar verebilir. alakalı bir link bulursam yollarım.
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...