Тилига кириш услубий қўлланма


Кўрсаткичларни осилиб қолиши



Download 0,98 Mb.
bet71/91
Sana28.04.2022
Hajmi0,98 Mb.
#588113
1   ...   67   68   69   70   71   72   73   74   ...   91
Bog'liq
C

Кўрсаткичларни осилиб қолиши


Кўрсаткичларни осилиб қолиши дастурчиларнинг кенг тарқалган хатоликларидан биридир. Агарда кўрсаткич мурожаат қилган объектни delete оператори орқали ўчирсак ва бу кўрсаткичга 0 қиймати ўзлаштирилмаса, бу ҳолда жорий кўрсатгич осилиб қолади. Кейинчалик дастурда бу кўрсаткичдан фойдаланиш турли муаммоларни келтириб чиқариши мумкин. Кўрсаткичнинг осилиб қолишида туғиладиган муаммо қуйидаги муаммога ўхшашдир. Почта хизмати янги офисга кўчди, сиз эса унинг олдинги телефонига қўнғироқ қилишни давом эттирасиз. Агарда бу номер ўчириб қўйилган бўлса яхши, бу катта муаммони туғдирмайди. Лекин, бу номер қандайдир ҳарбий заводга берилган бўлса, у ҳолда юз берадиган ҳолатни тасаввур қилишингиз мумкин.


Бир сўз билан айтганда, кўрсаткичлар устида delete операторини ишлатишда эҳтиёт бўлиш лозим. Бу ҳолда, агарда кўрсаткичга 0 қиймат ўзлаштирилмаса у олдинги қийматини, яъни ўчирилган объект адресини ўзида сақлайди. Дастурни ишлаши давомида айнан шу адресга бошқа объект аниқланиши мумкин, чунки олдинги объект delete оператори орқали ўчирилганидан сўнг, динамик хотирани бу қисмидан бемалол фойдаланиш мумкин бўлиб қолади. Натижада биз жорий кўрсаткичда биз умуман кутмаган объектга мурожаат ҳосил бўлиб қолади ва у дастурни ишлаш жараёнида нотўғри ҳодисаларни келтириб чиқариши мумкин. 8.9.- листингда осилиб қолган кўрсаткичларни ишлатилишига мисол келтирилган.
8.9. – листинг. Кўрсаткични осилиб қолишига мисол.

  1. // 8.9. – листинг.

  2. // Кўрсаткични осилиб қолишига мисол

  3. typedef unsigned short int ushort;

  4. # inсlude




  1. int main()

  2. {

  3. ushort * pInt = new ushort

  4. *pInt = 10;

  5. cout <<”* pInt:”<<* pInt <

  6. delete pInt;

  7. long * plong = new long;

  8. *pLong = 90000;

  9. cout << “*pLong: ” <<*pLong <

  10. *pInt=20 //бўш кўрсаткичга қиймат ўзлаштириш.

  11. cout << “*pInt:”<<* pInt <

  12. cout << “*pLong:”<<*pLong <

  13. delete pLong;

  14. return 0;

  15. }

НАТИЖА:
* pInt : 10


* pLong: 90000
* pInt: 20
* pLong: 65556.
(Cизнинг натижаларингиз юқоридагилардан фарқ қилиши мумкин )

ТАҲЛИЛ
7 – сатрда pInt ўзгарувчиси ushort типига кўрсаткич сифатида эълон қилинади ва бу типдаги маълумотни сақлаш учун хотира ажратилади. 8 – сатрда бу кўрсаткичдаги адресга 10 қиймати ёзилади. 9 – сатрда эса у экранга чиқарилади. Кейин эса pInt учун ажратилган хотира delete оператори орқали бўшатилади. Бундан сўнг жорий кўрсаткич осилиб қолади.


11 – сатрда pLong номли янги кўрсаткич эълон қилинади ва унга new оператори орқали ажратилган хотиранинг адреси ўзлаштирилади. 12 – сатрда кўрсаткичнинг бу адресига 90000 сони ёзилади ва 13 – сатрда бу қиймат экранга чиқарилади.
14 – сатрда pInt кўрсатиб турган адресга 20 қиймат ёзилади. Лекин, бу кўрсаткич учун ажратилган жой бўшатилган эди. Шунинг учун бундай операция нокорректдир. Бундай ўзлаштириш нотўғри натижаларни келтириб чиқаради. 15 – сатрда pInt нинг янги қиймати экранга чиқарилади. Бу қиймат кутилганидек 20 га тенг экан. 16 – сатрда эса pLong кўрсаткичининг қиймати чиқарилди. Лекин унинг қиймати биз кутмаган натижага тенг – 65556. Бу ерда иккита савол туғилади:

  1. Биз қандай қилиб pLong нинг қийматини ҳаттоки, уни ишлатмасдан туриб ўзгартирдик.

  2. 17 сатрда ўзлаштирилган қиймат қаерга жойлаштирилди.

Сиз албатта бу иккала савол ўзаро боғлиқ эканлигини пайқаган бўлсангиз керак. 17 – сатрга ўзлаштирилган қиймат pInt кўрсаткичи шу вақтгача кўрсатиб турган адресга ёзилди. Лекин бу адрес 11 – сатрда бўшатилган эди ва компилятор бу соҳани бошқа маълумотларни ёзиш учун ишлатган. pLong кўрсаткичи эълон қилинганда (13 – сатрда), олдин pInt кўрсаткичи мурожаат қилган хотира қисми у томонидан резервланди. (Айрим компютерларда бу ҳол бўлмаслиги ҳам мумкин). pInt кўрсатиб турган адресга 20 қийматнинг ёзилиши, шу адресда сақланаётган pLong кўрсаткичи кўрсатиб турган қийматни ўзгартиради. Чунки иккала кўрсаткич ҳам битта адресни кўрсатиб турибди. Шунинг учун олинган натижалар кутилганидек эмас.


Бир оз четга чиқиш бўлсада pLong кўрсаткичи адресидаги қиймат нима учун 65556 га тенг бўлиб қолганлигини батафсил кўриб чиқамиз.

  1. pInt кўрсаткичи хотирани биз 10 сонини ёзган қисмини кўрсатиб турар эди.

  2. delete оператори орқали биз компиляторга хотиранинг бу қисмида бошқа маълумотларни сақлашга имкон ҳосил қилдик, яъни хотирани бу жойини бўшатдик.

  3. *pLong ўзгарувчисига 90000 қиймат ўзлаштирилди. Компьютерда long типи тўрт байт жой эгаллайди ва машина даражасида 90000 сони 5F 90 00 01 кўринишда ифодаланади.

  4. Кейин pInt кўрсаткичига 20 қиймат ўзлаштирилди, у эса 16 – лик саноқ системасида 00 14 га эквивалент. Иккала кўрсаткич ҳам хотирани бир жойига мурожаат қилишидан 90000 сонининг олдинги икки байти қайта аниқланади. Натижада 00 14 00 01 сонига эга бўламиз.

  5. pLong кўрсаткичидаги қийматни экранга чиқаришда байтлар тартиби 00 01 00 14 га ўзгаради ва бунга эквивалент бўлган сон 65556 ҳосил бўлади.




Download 0,98 Mb.

Do'stlaringiz bilan baham:
1   ...   67   68   69   70   71   72   73   74   ...   91




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish