Kakšna je razlika med visečim kazalcem in ničelnim kazalcem v C? Tehnično sta oba videti enaka.


Odgovor 1:

Ni razlike, dokler ne odkloniš nobenega od teh kazalcev. Zato obešanje pomeni, da je spomin, na katerega kaže kazalec, dovoljeno ponovno uporabiti za kaj drugega, vendar program predpostavlja, da je stara vsebina še vedno tam in poskuša dostopati do nje. To običajno vodi do napačnega vedenja v nekem trenutku izvajanja programa.

Poleg tega menim, da samo vprašanje močno kaže, da "ne razumete kazalcev". Če si predstavljate spomin kot vrstico oštevilčenih polj, kjer ima lahko vsako polje vsebino (vrednost, običajno 0 ... 255), je kazalec preprosto celo število (tukaj poenostavljam arhitekturne posebnosti), ki vsebuje številko (ne vrednost) enega od teh polj.


Odgovor 2:

Tu vidim veliko "angleščine", ki bi bila lahko koristna za nekoga, ki že pozna koncept, toda za nekoga, ki tega ne bo, ne bo nič drugega kot glivična besedila. Vendar zabaven kvocient v odgovorih in metaforah odkimava, opravičilo, če koga užali.

Null Pointer: kazalec, ki vsebuje naslov na nič ali recimo NULL location. Pisanje na tej lokaciji je napako. Zasnovan je tako, da programerjem prepreči nenamerno pisanje na pomnilniško mesto, kar lahko povzroči napako segmentacije in / ali zruši. Ideja je bila, da kazalec vedno sprožite z NULL in pred pisanjem preverite, ali obstaja NULL. Upoštevajte ta scenarij:

int * p; // zdaj ta kazalec vsebuje naključni naslov, lahko kaže na katero koli lokacijo, tudi izven segmenta

* p = 10; // to bo zagotovo dalo krivdo.

varen način bi bil nekaj takega:

int * p = NULL;

če (p! = NULL)

* p = 10;

Dangling kazalec: Kot že ime pove, je kazalec, ki je pojma, kje naj se usmeri, ker je spominski blok, na katerega je bil prvotno usmerjen, nekako sproščen.

Obstaja veliko načinov, kako narediti kazalce obesiti. Najpogostejši način bi bil novo, kopiranje in brisanje

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

p = nov x;

q = p;

izbrisati q; // pomnilnik q in pomnilniški blok q se odstrani iz pomnilnika

// od tu imamo kazalec p z naslovom, ki v pomnilniku ne obstaja. Če poskušamo temu kazalcu dodeliti neko vrednost, smo v težavah, p tukaj je viseči kazalec

* p = 10; // zrušiti

drugi načini, na katere verjetno lahko slučajno ustvarite viseči kazalec, bi naredili plitvo kopijo predmeta bodisi z dodelitvijo bodisi s posredovanjem predmeta metodi, s čimer uporabite konstruktor kopiranja, ki ga je pripravil prevajalec in ki za vas spet naredi plitvo kopijo.


Odgovor 3:

Tu vidim veliko "angleščine", ki bi bila lahko koristna za nekoga, ki že pozna koncept, toda za nekoga, ki tega ne bo, ne bo nič drugega kot glivična besedila. Vendar zabaven kvocient v odgovorih in metaforah odkimava, opravičilo, če koga užali.

Null Pointer: kazalec, ki vsebuje naslov na nič ali recimo NULL location. Pisanje na tej lokaciji je napako. Zasnovan je tako, da programerjem prepreči nenamerno pisanje na pomnilniško mesto, kar lahko povzroči napako segmentacije in / ali zruši. Ideja je bila, da kazalec vedno sprožite z NULL in pred pisanjem preverite, ali obstaja NULL. Upoštevajte ta scenarij:

int * p; // zdaj ta kazalec vsebuje naključni naslov, lahko kaže na katero koli lokacijo, tudi izven segmenta

* p = 10; // to bo zagotovo dalo krivdo.

varen način bi bil nekaj takega:

int * p = NULL;

če (p! = NULL)

* p = 10;

Dangling kazalec: Kot že ime pove, je kazalec, ki je pojma, kje naj se usmeri, ker je spominski blok, na katerega je bil prvotno usmerjen, nekako sproščen.

Obstaja veliko načinov, kako narediti kazalce obesiti. Najpogostejši način bi bil novo, kopiranje in brisanje

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

p = nov x;

q = p;

izbrisati q; // pomnilnik q in pomnilniški blok q se odstrani iz pomnilnika

// od tu imamo kazalec p z naslovom, ki v pomnilniku ne obstaja. Če poskušamo temu kazalcu dodeliti neko vrednost, smo v težavah, p tukaj je viseči kazalec

* p = 10; // zrušiti

drugi načini, na katere verjetno lahko slučajno ustvarite viseči kazalec, bi naredili plitvo kopijo predmeta bodisi z dodelitvijo bodisi s posredovanjem predmeta metodi, s čimer uporabite konstruktor kopiranja, ki ga je pripravil prevajalec in ki za vas spet naredi plitvo kopijo.


Odgovor 4:

Tu vidim veliko "angleščine", ki bi bila lahko koristna za nekoga, ki že pozna koncept, toda za nekoga, ki tega ne bo, ne bo nič drugega kot glivična besedila. Vendar zabaven kvocient v odgovorih in metaforah odkimava, opravičilo, če koga užali.

Null Pointer: kazalec, ki vsebuje naslov na nič ali recimo NULL location. Pisanje na tej lokaciji je napako. Zasnovan je tako, da programerjem prepreči nenamerno pisanje na pomnilniško mesto, kar lahko povzroči napako segmentacije in / ali zruši. Ideja je bila, da kazalec vedno sprožite z NULL in pred pisanjem preverite, ali obstaja NULL. Upoštevajte ta scenarij:

int * p; // zdaj ta kazalec vsebuje naključni naslov, lahko kaže na katero koli lokacijo, tudi izven segmenta

* p = 10; // to bo zagotovo dalo krivdo.

varen način bi bil nekaj takega:

int * p = NULL;

če (p! = NULL)

* p = 10;

Dangling kazalec: Kot že ime pove, je kazalec, ki je pojma, kje naj se usmeri, ker je spominski blok, na katerega je bil prvotno usmerjen, nekako sproščen.

Obstaja veliko načinov, kako narediti kazalce obesiti. Najpogostejši način bi bil novo, kopiranje in brisanje

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

p = nov x;

q = p;

izbrisati q; // pomnilnik q in pomnilniški blok q se odstrani iz pomnilnika

// od tu imamo kazalec p z naslovom, ki v pomnilniku ne obstaja. Če poskušamo temu kazalcu dodeliti neko vrednost, smo v težavah, p tukaj je viseči kazalec

* p = 10; // zrušiti

drugi načini, na katere verjetno lahko slučajno ustvarite viseči kazalec, bi naredili plitvo kopijo predmeta bodisi z dodelitvijo bodisi s posredovanjem predmeta metodi, s čimer uporabite konstruktor kopiranja, ki ga je pripravil prevajalec in ki za vas spet naredi plitvo kopijo.


Odgovor 5:

Tu vidim veliko "angleščine", ki bi bila lahko koristna za nekoga, ki že pozna koncept, toda za nekoga, ki tega ne bo, ne bo nič drugega kot glivična besedila. Vendar zabaven kvocient v odgovorih in metaforah odkimava, opravičilo, če koga užali.

Null Pointer: kazalec, ki vsebuje naslov na nič ali recimo NULL location. Pisanje na tej lokaciji je napako. Zasnovan je tako, da programerjem prepreči nenamerno pisanje na pomnilniško mesto, kar lahko povzroči napako segmentacije in / ali zruši. Ideja je bila, da kazalec vedno sprožite z NULL in pred pisanjem preverite, ali obstaja NULL. Upoštevajte ta scenarij:

int * p; // zdaj ta kazalec vsebuje naključni naslov, lahko kaže na katero koli lokacijo, tudi izven segmenta

* p = 10; // to bo zagotovo dalo krivdo.

varen način bi bil nekaj takega:

int * p = NULL;

če (p! = NULL)

* p = 10;

Dangling kazalec: Kot že ime pove, je kazalec, ki je pojma, kje naj se usmeri, ker je spominski blok, na katerega je bil prvotno usmerjen, nekako sproščen.

Obstaja veliko načinov, kako narediti kazalce obesiti. Najpogostejši način bi bil novo, kopiranje in brisanje

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

p = nov x;

q = p;

izbrisati q; // pomnilnik q in pomnilniški blok q se odstrani iz pomnilnika

// od tu imamo kazalec p z naslovom, ki v pomnilniku ne obstaja. Če poskušamo temu kazalcu dodeliti neko vrednost, smo v težavah, p tukaj je viseči kazalec

* p = 10; // zrušiti

drugi načini, na katere verjetno lahko slučajno ustvarite viseči kazalec, bi naredili plitvo kopijo predmeta bodisi z dodelitvijo bodisi s posredovanjem predmeta metodi, s čimer uporabite konstruktor kopiranja, ki ga je pripravil prevajalec in ki za vas spet naredi plitvo kopijo.


Odgovor 6:

Tu vidim veliko "angleščine", ki bi bila lahko koristna za nekoga, ki že pozna koncept, toda za nekoga, ki tega ne bo, ne bo nič drugega kot glivična besedila. Vendar zabaven kvocient v odgovorih in metaforah odkimava, opravičilo, če koga užali.

Null Pointer: kazalec, ki vsebuje naslov na nič ali recimo NULL location. Pisanje na tej lokaciji je napako. Zasnovan je tako, da programerjem prepreči nenamerno pisanje na pomnilniško mesto, kar lahko povzroči napako segmentacije in / ali zruši. Ideja je bila, da kazalec vedno sprožite z NULL in pred pisanjem preverite, ali obstaja NULL. Upoštevajte ta scenarij:

int * p; // zdaj ta kazalec vsebuje naključni naslov, lahko kaže na katero koli lokacijo, tudi izven segmenta

* p = 10; // to bo zagotovo dalo krivdo.

varen način bi bil nekaj takega:

int * p = NULL;

če (p! = NULL)

* p = 10;

Dangling kazalec: Kot že ime pove, je kazalec, ki je pojma, kje naj se usmeri, ker je spominski blok, na katerega je bil prvotno usmerjen, nekako sproščen.

Obstaja veliko načinov, kako narediti kazalce obesiti. Najpogostejši način bi bil novo, kopiranje in brisanje

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

p = nov x;

q = p;

izbrisati q; // pomnilnik q in pomnilniški blok q se odstrani iz pomnilnika

// od tu imamo kazalec p z naslovom, ki v pomnilniku ne obstaja. Če poskušamo temu kazalcu dodeliti neko vrednost, smo v težavah, p tukaj je viseči kazalec

* p = 10; // zrušiti

drugi načini, na katere verjetno lahko slučajno ustvarite viseči kazalec, bi naredili plitvo kopijo predmeta bodisi z dodelitvijo bodisi s posredovanjem predmeta metodi, s čimer uporabite konstruktor kopiranja, ki ga je pripravil prevajalec in ki za vas spet naredi plitvo kopijo.


Odgovor 7:

Tu vidim veliko "angleščine", ki bi bila lahko koristna za nekoga, ki že pozna koncept, toda za nekoga, ki tega ne bo, ne bo nič drugega kot glivična besedila. Vendar zabaven kvocient v odgovorih in metaforah odkimava, opravičilo, če koga užali.

Null Pointer: kazalec, ki vsebuje naslov na nič ali recimo NULL location. Pisanje na tej lokaciji je napako. Zasnovan je tako, da programerjem prepreči nenamerno pisanje na pomnilniško mesto, kar lahko povzroči napako segmentacije in / ali zruši. Ideja je bila, da kazalec vedno sprožite z NULL in pred pisanjem preverite, ali obstaja NULL. Upoštevajte ta scenarij:

int * p; // zdaj ta kazalec vsebuje naključni naslov, lahko kaže na katero koli lokacijo, tudi izven segmenta

* p = 10; // to bo zagotovo dalo krivdo.

varen način bi bil nekaj takega:

int * p = NULL;

če (p! = NULL)

* p = 10;

Dangling kazalec: Kot že ime pove, je kazalec, ki je pojma, kje naj se usmeri, ker je spominski blok, na katerega je bil prvotno usmerjen, nekako sproščen.

Obstaja veliko načinov, kako narediti kazalce obesiti. Najpogostejši način bi bil novo, kopiranje in brisanje

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

p = nov x;

q = p;

izbrisati q; // pomnilnik q in pomnilniški blok q se odstrani iz pomnilnika

// od tu imamo kazalec p z naslovom, ki v pomnilniku ne obstaja. Če poskušamo temu kazalcu dodeliti neko vrednost, smo v težavah, p tukaj je viseči kazalec

* p = 10; // zrušiti

drugi načini, na katere verjetno lahko slučajno ustvarite viseči kazalec, bi naredili plitvo kopijo predmeta bodisi z dodelitvijo bodisi s posredovanjem predmeta metodi, s čimer uporabite konstruktor kopiranja, ki ga je pripravil prevajalec in ki za vas spet naredi plitvo kopijo.


Odgovor 8:

Tu vidim veliko "angleščine", ki bi bila lahko koristna za nekoga, ki že pozna koncept, toda za nekoga, ki tega ne bo, ne bo nič drugega kot glivična besedila. Vendar zabaven kvocient v odgovorih in metaforah odkimava, opravičilo, če koga užali.

Null Pointer: kazalec, ki vsebuje naslov na nič ali recimo NULL location. Pisanje na tej lokaciji je napako. Zasnovan je tako, da programerjem prepreči nenamerno pisanje na pomnilniško mesto, kar lahko povzroči napako segmentacije in / ali zruši. Ideja je bila, da kazalec vedno sprožite z NULL in pred pisanjem preverite, ali obstaja NULL. Upoštevajte ta scenarij:

int * p; // zdaj ta kazalec vsebuje naključni naslov, lahko kaže na katero koli lokacijo, tudi izven segmenta

* p = 10; // to bo zagotovo dalo krivdo.

varen način bi bil nekaj takega:

int * p = NULL;

če (p! = NULL)

* p = 10;

Dangling kazalec: Kot že ime pove, je kazalec, ki je pojma, kje naj se usmeri, ker je spominski blok, na katerega je bil prvotno usmerjen, nekako sproščen.

Obstaja veliko načinov, kako narediti kazalce obesiti. Najpogostejši način bi bil novo, kopiranje in brisanje

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

p = nov x;

q = p;

izbrisati q; // pomnilnik q in pomnilniški blok q se odstrani iz pomnilnika

// od tu imamo kazalec p z naslovom, ki v pomnilniku ne obstaja. Če poskušamo temu kazalcu dodeliti neko vrednost, smo v težavah, p tukaj je viseči kazalec

* p = 10; // zrušiti

drugi načini, na katere verjetno lahko slučajno ustvarite viseči kazalec, bi naredili plitvo kopijo predmeta bodisi z dodelitvijo bodisi s posredovanjem predmeta metodi, s čimer uporabite konstruktor kopiranja, ki ga je pripravil prevajalec in ki za vas spet naredi plitvo kopijo.


Odgovor 9:

Tu vidim veliko "angleščine", ki bi bila lahko koristna za nekoga, ki že pozna koncept, toda za nekoga, ki tega ne bo, ne bo nič drugega kot glivična besedila. Vendar zabaven kvocient v odgovorih in metaforah odkimava, opravičilo, če koga užali.

Null Pointer: kazalec, ki vsebuje naslov na nič ali recimo NULL location. Pisanje na tej lokaciji je napako. Zasnovan je tako, da programerjem prepreči nenamerno pisanje na pomnilniško mesto, kar lahko povzroči napako segmentacije in / ali zruši. Ideja je bila, da kazalec vedno sprožite z NULL in pred pisanjem preverite, ali obstaja NULL. Upoštevajte ta scenarij:

int * p; // zdaj ta kazalec vsebuje naključni naslov, lahko kaže na katero koli lokacijo, tudi izven segmenta

* p = 10; // to bo zagotovo dalo krivdo.

varen način bi bil nekaj takega:

int * p = NULL;

če (p! = NULL)

* p = 10;

Dangling kazalec: Kot že ime pove, je kazalec, ki je pojma, kje naj se usmeri, ker je spominski blok, na katerega je bil prvotno usmerjen, nekako sproščen.

Obstaja veliko načinov, kako narediti kazalce obesiti. Najpogostejši način bi bil novo, kopiranje in brisanje

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

p = nov x;

q = p;

izbrisati q; // pomnilnik q in pomnilniški blok q se odstrani iz pomnilnika

// od tu imamo kazalec p z naslovom, ki v pomnilniku ne obstaja. Če poskušamo temu kazalcu dodeliti neko vrednost, smo v težavah, p tukaj je viseči kazalec

* p = 10; // zrušiti

drugi načini, na katere verjetno lahko slučajno ustvarite viseči kazalec, bi naredili plitvo kopijo predmeta bodisi z dodelitvijo bodisi s posredovanjem predmeta metodi, s čimer uporabite konstruktor kopiranja, ki ga je pripravil prevajalec in ki za vas spet naredi plitvo kopijo.


Odgovor 10:

Tu vidim veliko "angleščine", ki bi bila lahko koristna za nekoga, ki že pozna koncept, toda za nekoga, ki tega ne bo, ne bo nič drugega kot glivična besedila. Vendar zabaven kvocient v odgovorih in metaforah odkimava, opravičilo, če koga užali.

Null Pointer: kazalec, ki vsebuje naslov na nič ali recimo NULL location. Pisanje na tej lokaciji je napako. Zasnovan je tako, da programerjem prepreči nenamerno pisanje na pomnilniško mesto, kar lahko povzroči napako segmentacije in / ali zruši. Ideja je bila, da kazalec vedno sprožite z NULL in pred pisanjem preverite, ali obstaja NULL. Upoštevajte ta scenarij:

int * p; // zdaj ta kazalec vsebuje naključni naslov, lahko kaže na katero koli lokacijo, tudi izven segmenta

* p = 10; // to bo zagotovo dalo krivdo.

varen način bi bil nekaj takega:

int * p = NULL;

če (p! = NULL)

* p = 10;

Dangling kazalec: Kot že ime pove, je kazalec, ki je pojma, kje naj se usmeri, ker je spominski blok, na katerega je bil prvotno usmerjen, nekako sproščen.

Obstaja veliko načinov, kako narediti kazalce obesiti. Najpogostejši način bi bil novo, kopiranje in brisanje

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

p = nov x;

q = p;

izbrisati q; // pomnilnik q in pomnilniški blok q se odstrani iz pomnilnika

// od tu imamo kazalec p z naslovom, ki v pomnilniku ne obstaja. Če poskušamo temu kazalcu dodeliti neko vrednost, smo v težavah, p tukaj je viseči kazalec

* p = 10; // zrušiti

drugi načini, na katere verjetno lahko slučajno ustvarite viseči kazalec, bi naredili plitvo kopijo predmeta bodisi z dodelitvijo bodisi s posredovanjem predmeta metodi, s čimer uporabite konstruktor kopiranja, ki ga je pripravil prevajalec in ki za vas spet naredi plitvo kopijo.