Hver er munurinn á dinglandi bendli og núllmælin í C? Tæknilega séð virðast báðir eins.


svara 1:

Það er enginn munur nema þú valdir einu af þessum ábendingum. Schlenker þýðir því að hægt er að endurnýta minnið sem bendillinn vísar til fyrir eitthvað annað. Forritið gerir hins vegar ráð fyrir að gamla efnið sé enn til staðar og reynir að fá aðgang að því. Þetta leiðir venjulega til rangrar hegðunar við framkvæmd forritsins.

Ennfremur tel ég að spurningin sjálf bendi eindregið til þess að þú „skiljir ekki ábendingar“. Ef þú hugsar um minni sem röð af tölusettum reitum þar sem hver reitur getur haft innihald (gildi, venjulega 0 ... 255), er bendillinn einfaldlega heiltala (ég er að einfalda arkitektúrareiginleikana hér) sem Númer inniheldur (ekki gildi) einn af þessum reitum.


svara 2:

Ég sé mikið af „ensku“ hérna, sem gæti komið að gagni fyrir einhvern sem þekkir hugtakið nú þegar, en fyrir einhvern sem gerir það ekki, þá verður það ekkert annað en drasl textar. Fyndinn kvóti merkir hins vegar svörin og myndlíkingar. Því miður ef það móðgar einhvern.

Null bendill: Bendill sem inniheldur heimilisfangið að engu eða segir NULL. Að skrifa á þessum tímapunkti eru mistök. Þetta er til að koma í veg fyrir að forritarar skrifi óvart á staðsetningu sem getur leitt til skiptingarvillu og / eða hruns. Auðvitað ætti að frumstilla bendilinn með NULL og athuga hvort hann sé NULL áður en hann skrifar. Lítum á þessa atburðarás:

int * p; // Sem stendur inniheldur þessi bendill handahófi og getur vísað til hvaða stöðu sem er, jafnvel fyrir utan hluti

* p = 10; // Það mun örugglega gefa villu.

eitthvað öruggt væri:

int * p = NULL;

ef (p! = NULL)

* p = 10;

Dangling bendill: Eins og nafnið gefur til kynna er bendillinn sem hefur enga hugmynd um hvert eigi að vísa vegna þess að minnisblokkin sem það var upphaflega bent á er einhvern veginn gefin út.

Það eru margar leiðir til að láta bendilinn dingla. Algengasta leiðin væri að búa til, afrita og eyða nýjum

int * p = NULL; int * q = NULL;

p = nýtt x;

q = p;

q eyða; // q og minnisminnisvísir q eru fjarlægðir úr minni

// héðan höfum við bendilinn p með heimilisfangi sem er ekki til í minni. Ef við reynum að úthluta gildi til þessarar vísar erum við í vandræðum, p bendirinn hangir hér

* p = 10; // hrun

Önnur leið sem þú getur sennilega búið til dinglandi bendil fyrir tilviljun er að búa til flatt afrit af hlutnum, annað hvort með því að tengja það eða með því að framselja hlut til aðferðar með því að nota þýðanda gerð afritagerðar, sem aftur er flatur Afrit gert fyrir þig.


svara 3:

Ég sé mikið af „ensku“ hérna, sem gæti komið að gagni fyrir einhvern sem þekkir hugtakið nú þegar, en fyrir einhvern sem gerir það ekki, þá verður það ekkert annað en drasl textar. Fyndinn kvóti merkir hins vegar svörin og myndlíkingar. Því miður ef það móðgar einhvern.

Null bendill: Bendill sem inniheldur heimilisfangið að engu eða segir NULL. Að skrifa á þessum tímapunkti eru mistök. Þetta er til að koma í veg fyrir að forritarar skrifi óvart á staðsetningu sem getur leitt til skiptingarvillu og / eða hruns. Auðvitað ætti að frumstilla bendilinn með NULL og athuga hvort hann sé NULL áður en hann skrifar. Lítum á þessa atburðarás:

int * p; // Sem stendur inniheldur þessi bendill handahófi og getur vísað til hvaða stöðu sem er, jafnvel fyrir utan hluti

* p = 10; // Það mun örugglega gefa villu.

eitthvað öruggt væri:

int * p = NULL;

ef (p! = NULL)

* p = 10;

Dangling bendill: Eins og nafnið gefur til kynna er bendillinn sem hefur enga hugmynd um hvert eigi að vísa vegna þess að minnisblokkin sem það var upphaflega bent á er einhvern veginn gefin út.

Það eru margar leiðir til að láta bendilinn dingla. Algengasta leiðin væri að búa til, afrita og eyða nýjum

int * p = NULL; int * q = NULL;

p = nýtt x;

q = p;

q eyða; // q og minnisminnisvísir q eru fjarlægðir úr minni

// héðan höfum við bendilinn p með heimilisfangi sem er ekki til í minni. Ef við reynum að úthluta gildi til þessarar vísar erum við í vandræðum, p bendirinn hangir hér

* p = 10; // hrun

Önnur leið sem þú getur sennilega búið til dinglandi bendil fyrir tilviljun er að búa til flatt afrit af hlutnum, annað hvort með því að tengja það eða með því að framselja hlut til aðferðar með því að nota þýðanda gerð afritagerðar, sem aftur er flatur Afrit gert fyrir þig.


svara 4:

Ég sé mikið af „ensku“ hérna, sem gæti komið að gagni fyrir einhvern sem þekkir hugtakið nú þegar, en fyrir einhvern sem gerir það ekki, þá verður það ekkert annað en drasl textar. Fyndinn kvóti merkir hins vegar svörin og myndlíkingar. Því miður ef það móðgar einhvern.

Null bendill: Bendill sem inniheldur heimilisfangið að engu eða segir NULL. Að skrifa á þessum tímapunkti eru mistök. Þetta er til að koma í veg fyrir að forritarar skrifi óvart á staðsetningu sem getur leitt til skiptingarvillu og / eða hruns. Auðvitað ætti að frumstilla bendilinn með NULL og athuga hvort hann sé NULL áður en hann skrifar. Lítum á þessa atburðarás:

int * p; // Sem stendur inniheldur þessi bendill handahófi og getur vísað til hvaða stöðu sem er, jafnvel fyrir utan hluti

* p = 10; // Það mun örugglega gefa villu.

eitthvað öruggt væri:

int * p = NULL;

ef (p! = NULL)

* p = 10;

Dangling bendill: Eins og nafnið gefur til kynna er bendillinn sem hefur enga hugmynd um hvert eigi að vísa vegna þess að minnisblokkin sem það var upphaflega bent á er einhvern veginn gefin út.

Það eru margar leiðir til að láta bendilinn dingla. Algengasta leiðin væri að búa til, afrita og eyða nýjum

int * p = NULL; int * q = NULL;

p = nýtt x;

q = p;

q eyða; // q og minnisminnisvísir q eru fjarlægðir úr minni

// héðan höfum við bendilinn p með heimilisfangi sem er ekki til í minni. Ef við reynum að úthluta gildi til þessarar vísar erum við í vandræðum, p bendirinn hangir hér

* p = 10; // hrun

Önnur leið sem þú getur sennilega búið til dinglandi bendil fyrir tilviljun er að búa til flatt afrit af hlutnum, annað hvort með því að tengja það eða með því að framselja hlut til aðferðar með því að nota þýðanda gerð afritagerðar, sem aftur er flatur Afrit gert fyrir þig.


svara 5:

Ég sé mikið af „ensku“ hérna, sem gæti komið að gagni fyrir einhvern sem þekkir hugtakið nú þegar, en fyrir einhvern sem gerir það ekki, þá verður það ekkert annað en drasl textar. Fyndinn kvóti merkir hins vegar svörin og myndlíkingar. Því miður ef það móðgar einhvern.

Null bendill: Bendill sem inniheldur heimilisfangið að engu eða segir NULL. Að skrifa á þessum tímapunkti eru mistök. Þetta er til að koma í veg fyrir að forritarar skrifi óvart á staðsetningu sem getur leitt til skiptingarvillu og / eða hruns. Auðvitað ætti að frumstilla bendilinn með NULL og athuga hvort hann sé NULL áður en hann skrifar. Lítum á þessa atburðarás:

int * p; // Sem stendur inniheldur þessi bendill handahófi og getur vísað til hvaða stöðu sem er, jafnvel fyrir utan hluti

* p = 10; // Það mun örugglega gefa villu.

eitthvað öruggt væri:

int * p = NULL;

ef (p! = NULL)

* p = 10;

Dangling bendill: Eins og nafnið gefur til kynna er bendillinn sem hefur enga hugmynd um hvert eigi að vísa vegna þess að minnisblokkin sem það var upphaflega bent á er einhvern veginn gefin út.

Það eru margar leiðir til að láta bendilinn dingla. Algengasta leiðin væri að búa til, afrita og eyða nýjum

int * p = NULL; int * q = NULL;

p = nýtt x;

q = p;

q eyða; // q og minnisminnisvísir q eru fjarlægðir úr minni

// héðan höfum við bendilinn p með heimilisfangi sem er ekki til í minni. Ef við reynum að úthluta gildi til þessarar vísar erum við í vandræðum, p bendirinn hangir hér

* p = 10; // hrun

Önnur leið sem þú getur sennilega búið til dinglandi bendil fyrir tilviljun er að búa til flatt afrit af hlutnum, annað hvort með því að tengja það eða með því að framselja hlut til aðferðar með því að nota þýðanda gerð afritagerðar, sem aftur er flatur Afrit gert fyrir þig.


svara 6:

Ég sé mikið af „ensku“ hérna, sem gæti komið að gagni fyrir einhvern sem þekkir hugtakið nú þegar, en fyrir einhvern sem gerir það ekki, þá verður það ekkert annað en drasl textar. Fyndinn kvóti merkir hins vegar svörin og myndlíkingar. Því miður ef það móðgar einhvern.

Null bendill: Bendill sem inniheldur heimilisfangið að engu eða segir NULL. Að skrifa á þessum tímapunkti eru mistök. Þetta er til að koma í veg fyrir að forritarar skrifi óvart á staðsetningu sem getur leitt til skiptingarvillu og / eða hruns. Auðvitað ætti að frumstilla bendilinn með NULL og athuga hvort hann sé NULL áður en hann skrifar. Lítum á þessa atburðarás:

int * p; // Sem stendur inniheldur þessi bendill handahófi og getur vísað til hvaða stöðu sem er, jafnvel fyrir utan hluti

* p = 10; // Það mun örugglega gefa villu.

eitthvað öruggt væri:

int * p = NULL;

ef (p! = NULL)

* p = 10;

Dangling bendill: Eins og nafnið gefur til kynna er bendillinn sem hefur enga hugmynd um hvert eigi að vísa vegna þess að minnisblokkin sem það var upphaflega bent á er einhvern veginn gefin út.

Það eru margar leiðir til að láta bendilinn dingla. Algengasta leiðin væri að búa til, afrita og eyða nýjum

int * p = NULL; int * q = NULL;

p = nýtt x;

q = p;

q eyða; // q og minnisminnisvísir q eru fjarlægðir úr minni

// héðan höfum við bendilinn p með heimilisfangi sem er ekki til í minni. Ef við reynum að úthluta gildi til þessarar vísar erum við í vandræðum, p bendirinn hangir hér

* p = 10; // hrun

Önnur leið sem þú getur sennilega búið til dinglandi bendil fyrir tilviljun er að búa til flatt afrit af hlutnum, annað hvort með því að tengja það eða með því að framselja hlut til aðferðar með því að nota þýðanda gerð afritagerðar, sem aftur er flatur Afrit gert fyrir þig.


svara 7:

Ég sé mikið af „ensku“ hérna, sem gæti komið að gagni fyrir einhvern sem þekkir hugtakið nú þegar, en fyrir einhvern sem gerir það ekki, þá verður það ekkert annað en drasl textar. Fyndinn kvóti merkir hins vegar svörin og myndlíkingar. Því miður ef það móðgar einhvern.

Null bendill: Bendill sem inniheldur heimilisfangið að engu eða segir NULL. Að skrifa á þessum tímapunkti eru mistök. Þetta er til að koma í veg fyrir að forritarar skrifi óvart á staðsetningu sem getur leitt til skiptingarvillu og / eða hruns. Auðvitað ætti að frumstilla bendilinn með NULL og athuga hvort hann sé NULL áður en hann skrifar. Lítum á þessa atburðarás:

int * p; // Sem stendur inniheldur þessi bendill handahófi og getur vísað til hvaða stöðu sem er, jafnvel fyrir utan hluti

* p = 10; // Það mun örugglega gefa villu.

eitthvað öruggt væri:

int * p = NULL;

ef (p! = NULL)

* p = 10;

Dangling bendill: Eins og nafnið gefur til kynna er bendillinn sem hefur enga hugmynd um hvert eigi að vísa vegna þess að minnisblokkin sem það var upphaflega bent á er einhvern veginn gefin út.

Það eru margar leiðir til að láta bendilinn dingla. Algengasta leiðin væri að búa til, afrita og eyða nýjum

int * p = NULL; int * q = NULL;

p = nýtt x;

q = p;

q eyða; // q og minnisminnisvísir q eru fjarlægðir úr minni

// héðan höfum við bendilinn p með heimilisfangi sem er ekki til í minni. Ef við reynum að úthluta gildi til þessarar vísar erum við í vandræðum, p bendirinn hangir hér

* p = 10; // hrun

Önnur leið sem þú getur sennilega búið til dinglandi bendil fyrir tilviljun er að búa til flatt afrit af hlutnum, annað hvort með því að tengja það eða með því að framselja hlut til aðferðar með því að nota þýðanda gerð afritagerðar, sem aftur er flatur Afrit gert fyrir þig.


svara 8:

Ég sé mikið af „ensku“ hérna, sem gæti komið að gagni fyrir einhvern sem þekkir hugtakið nú þegar, en fyrir einhvern sem gerir það ekki, þá verður það ekkert annað en drasl textar. Fyndinn kvóti merkir hins vegar svörin og myndlíkingar. Því miður ef það móðgar einhvern.

Null bendill: Bendill sem inniheldur heimilisfangið að engu eða segir NULL. Að skrifa á þessum tímapunkti eru mistök. Þetta er til að koma í veg fyrir að forritarar skrifi óvart á staðsetningu sem getur leitt til skiptingarvillu og / eða hruns. Auðvitað ætti að frumstilla bendilinn með NULL og athuga hvort hann sé NULL áður en hann skrifar. Lítum á þessa atburðarás:

int * p; // Sem stendur inniheldur þessi bendill handahófi og getur vísað til hvaða stöðu sem er, jafnvel fyrir utan hluti

* p = 10; // Það mun örugglega gefa villu.

eitthvað öruggt væri:

int * p = NULL;

ef (p! = NULL)

* p = 10;

Dangling bendill: Eins og nafnið gefur til kynna er bendillinn sem hefur enga hugmynd um hvert eigi að vísa vegna þess að minnisblokkin sem það var upphaflega bent á er einhvern veginn gefin út.

Það eru margar leiðir til að láta bendilinn dingla. Algengasta leiðin væri að búa til, afrita og eyða nýjum

int * p = NULL; int * q = NULL;

p = nýtt x;

q = p;

q eyða; // q og minnisminnisvísir q eru fjarlægðir úr minni

// héðan höfum við bendilinn p með heimilisfangi sem er ekki til í minni. Ef við reynum að úthluta gildi til þessarar vísar erum við í vandræðum, p bendirinn hangir hér

* p = 10; // hrun

Önnur leið sem þú getur sennilega búið til dinglandi bendil fyrir tilviljun er að búa til flatt afrit af hlutnum, annað hvort með því að tengja það eða með því að framselja hlut til aðferðar með því að nota þýðanda gerð afritagerðar, sem aftur er flatur Afrit gert fyrir þig.


svara 9:

Ég sé mikið af „ensku“ hérna, sem gæti komið að gagni fyrir einhvern sem þekkir hugtakið nú þegar, en fyrir einhvern sem gerir það ekki, þá verður það ekkert annað en drasl textar. Fyndinn kvóti merkir hins vegar svörin og myndlíkingar. Því miður ef það móðgar einhvern.

Null bendill: Bendill sem inniheldur heimilisfangið að engu eða segir NULL. Að skrifa á þessum tímapunkti eru mistök. Þetta er til að koma í veg fyrir að forritarar skrifi óvart á staðsetningu sem getur leitt til skiptingarvillu og / eða hruns. Auðvitað ætti að frumstilla bendilinn með NULL og athuga hvort hann sé NULL áður en hann skrifar. Lítum á þessa atburðarás:

int * p; // Sem stendur inniheldur þessi bendill handahófi og getur vísað til hvaða stöðu sem er, jafnvel fyrir utan hluti

* p = 10; // Það mun örugglega gefa villu.

eitthvað öruggt væri:

int * p = NULL;

ef (p! = NULL)

* p = 10;

Dangling bendill: Eins og nafnið gefur til kynna er bendillinn sem hefur enga hugmynd um hvert eigi að vísa vegna þess að minnisblokkin sem það var upphaflega bent á er einhvern veginn gefin út.

Það eru margar leiðir til að láta bendilinn dingla. Algengasta leiðin væri að búa til, afrita og eyða nýjum

int * p = NULL; int * q = NULL;

p = nýtt x;

q = p;

q eyða; // q og minnisminnisvísir q eru fjarlægðir úr minni

// héðan höfum við bendilinn p með heimilisfangi sem er ekki til í minni. Ef við reynum að úthluta gildi til þessarar vísar erum við í vandræðum, p bendirinn hangir hér

* p = 10; // hrun

Önnur leið sem þú getur sennilega búið til dinglandi bendil fyrir tilviljun er að búa til flatt afrit af hlutnum, annað hvort með því að tengja það eða með því að framselja hlut til aðferðar með því að nota þýðanda gerð afritagerðar, sem aftur er flatur Afrit gert fyrir þig.


svara 10:

Ég sé mikið af „ensku“ hérna, sem gæti komið að gagni fyrir einhvern sem þekkir hugtakið nú þegar, en fyrir einhvern sem gerir það ekki, þá verður það ekkert annað en drasl textar. Fyndinn kvóti merkir hins vegar svörin og myndlíkingar. Því miður ef það móðgar einhvern.

Null bendill: Bendill sem inniheldur heimilisfangið að engu eða segir NULL. Að skrifa á þessum tímapunkti eru mistök. Þetta er til að koma í veg fyrir að forritarar skrifi óvart á staðsetningu sem getur leitt til skiptingarvillu og / eða hruns. Auðvitað ætti að frumstilla bendilinn með NULL og athuga hvort hann sé NULL áður en hann skrifar. Lítum á þessa atburðarás:

int * p; // Sem stendur inniheldur þessi bendill handahófi og getur vísað til hvaða stöðu sem er, jafnvel fyrir utan hluti

* p = 10; // Það mun örugglega gefa villu.

eitthvað öruggt væri:

int * p = NULL;

ef (p! = NULL)

* p = 10;

Dangling bendill: Eins og nafnið gefur til kynna er bendillinn sem hefur enga hugmynd um hvert eigi að vísa vegna þess að minnisblokkin sem það var upphaflega bent á er einhvern veginn gefin út.

Það eru margar leiðir til að láta bendilinn dingla. Algengasta leiðin væri að búa til, afrita og eyða nýjum

int * p = NULL; int * q = NULL;

p = nýtt x;

q = p;

q eyða; // q og minnisminnisvísir q eru fjarlægðir úr minni

// héðan höfum við bendilinn p með heimilisfangi sem er ekki til í minni. Ef við reynum að úthluta gildi til þessarar vísar erum við í vandræðum, p bendirinn hangir hér

* p = 10; // hrun

Önnur leið sem þú getur sennilega búið til dinglandi bendil fyrir tilviljun er að búa til flatt afrit af hlutnum, annað hvort með því að tengja það eða með því að framselja hlut til aðferðar með því að nota þýðanda gerð afritagerðar, sem aftur er flatur Afrit gert fyrir þig.