У чым розніца паміж звісаючым паказальнікам і нулявым паказальнікам у С? Тэхнічна кажучы, абодва здаюцца аднолькавымі.


адказ 1:

Няма розніцы, калі вы не адпусціце адзін з гэтых паказальнікаў. Такім чынам, Шленкер азначае, што памяць, на якую паказвае паказальнік, можа быць выкарыстана для чагосьці іншага. Аднак праграма мяркуе, што стары змест яшчэ ёсць і спрабуе атрымаць доступ да яго. Звычайна гэта прыводзіць да няправільнага паводзінаў падчас выканання праграмы.

Акрамя таго, я лічу, што само пытанне настойліва сведчыць аб тым, што вы не "разумееце паказальнікі". Калі вы думаеце пра памяць як серыю пранумараваных палёў, у якіх кожнае поле можа мець змест (значэнне, як правіла, 0 ... 255), паказальнік проста цэлае (я спрашчаю архітэктурныя асаблівасці тут), Нумар утрымлівае (не значэнне) аднаго з гэтых акенцаў.


адказ 2:

Я бачу тут шмат "ангельскіх", якія могуць спатрэбіцца таму, хто ўжо ведае гэтую канцэпцыю, але для тых, хто гэтага не ведае, гэта будзе не больш, чым ліхаманкавая лірыка. Аднак смешныя каэфіцыенты цікавяць адказы і метафары. Выбачайце, калі гэта кагосьці абражае.

Нулявы паказальнік: паказальнік, які змяшчае адрас ні да чаго альбо не кажа NULL. Пісаць у гэты момант - памылка. Гэта дазваляе прадухіліць выпадковае напісанне праграмістамі на месца, што можа прывесці да памылак сегментацыі і / або збояў. Указальнік заўсёды павінен быць ініцыялізаваны NULL і правераны на NULL перад напісаннем. Разгледзім гэты сцэнар:

Int * p; // У дадзены момант гэты паказальнік утрымлівае выпадковы адрас і можа спасылацца на любую пазіцыю, нават за межамі сегмента

* р = 10; // Гэта, безумоўна, прывядзе да памылкі.

нешта бяспечнае будзе:

int * p = NULL;

калі (р! = NULL)

* р = 10;

Шчырлівы паказальнік: Як вынікае з назвы, гэта паказальнік, які паняцця не мае, дзе пазначыць, таму што блок памяці, які ён першапачаткова паказваў, нейкім чынам вызвалены.

Існуе шмат спосабаў павесіць паказальнік. Самым распаўсюджаным спосабам было б ствараць, капіяваць і выдаляць новыя

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

р = новы х;

q = р;

q выдаліць; // Указальнік блока памяці q і q выдаляецца з памяці

// адсюль у нас паказальнік p з адрасам, які не існуе ў памяці. Калі мы паспрабуем прысвоіць гэтаму паказальніку значэнне, мы ў бядзе, p паказальнік тут вісіць

* р = 10; // крах

Іншы спосаб, калі вы можаце выпадкова стварыць звісаючы паказальнік, - гэта зрабіць плоскую копію аб'екта альбо шляхам прысваення яго, альбо перадачы аб'екта метаду з выкарыстаннем канструктара копіі, які прадстаўляецца кампілятарам. Копія зроблена для вас.


адказ 3:

Я бачу тут шмат "ангельскіх", якія могуць спатрэбіцца таму, хто ўжо ведае гэтую канцэпцыю, але для тых, хто гэтага не ведае, гэта будзе не больш, чым ліхаманкавая лірыка. Аднак смешныя каэфіцыенты цікавяць адказы і метафары. Выбачайце, калі гэта кагосьці абражае.

Нулявы паказальнік: паказальнік, які змяшчае адрас ні да чаго альбо не кажа NULL. Пісаць у гэты момант - памылка. Гэта дазваляе прадухіліць выпадковае напісанне праграмістамі на месца, што можа прывесці да памылак сегментацыі і / або збояў. Указальнік заўсёды павінен быць ініцыялізаваны NULL і правераны на NULL перад напісаннем. Разгледзім гэты сцэнар:

Int * p; // У дадзены момант гэты паказальнік утрымлівае выпадковы адрас і можа спасылацца на любую пазіцыю, нават за межамі сегмента

* р = 10; // Гэта, безумоўна, прывядзе да памылкі.

нешта бяспечнае будзе:

int * p = NULL;

калі (р! = NULL)

* р = 10;

Шчырлівы паказальнік: Як вынікае з назвы, гэта паказальнік, які паняцця не мае, дзе пазначыць, таму што блок памяці, які ён першапачаткова паказваў, нейкім чынам вызвалены.

Існуе шмат спосабаў павесіць паказальнік. Самым распаўсюджаным спосабам было б ствараць, капіяваць і выдаляць новыя

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

р = новы х;

q = р;

q выдаліць; // Указальнік блока памяці q і q выдаляецца з памяці

// адсюль у нас паказальнік p з адрасам, які не існуе ў памяці. Калі мы паспрабуем прысвоіць гэтаму паказальніку значэнне, мы ў бядзе, p паказальнік тут вісіць

* р = 10; // крах

Іншы спосаб, калі вы можаце выпадкова стварыць звісаючы паказальнік, - гэта зрабіць плоскую копію аб'екта альбо шляхам прысваення яго, альбо перадачы аб'екта метаду з выкарыстаннем канструктара копіі, які прадстаўляецца кампілятарам. Копія зроблена для вас.


адказ 4:

Я бачу тут шмат "ангельскіх", якія могуць спатрэбіцца таму, хто ўжо ведае гэтую канцэпцыю, але для тых, хто гэтага не ведае, гэта будзе не больш, чым ліхаманкавая лірыка. Аднак смешныя каэфіцыенты цікавяць адказы і метафары. Выбачайце, калі гэта кагосьці абражае.

Нулявы паказальнік: паказальнік, які змяшчае адрас ні да чаго альбо не кажа NULL. Пісаць у гэты момант - памылка. Гэта дазваляе прадухіліць выпадковае напісанне праграмістамі на месца, што можа прывесці да памылак сегментацыі і / або збояў. Указальнік заўсёды павінен быць ініцыялізаваны NULL і правераны на NULL перад напісаннем. Разгледзім гэты сцэнар:

Int * p; // У дадзены момант гэты паказальнік утрымлівае выпадковы адрас і можа спасылацца на любую пазіцыю, нават за межамі сегмента

* р = 10; // Гэта, безумоўна, прывядзе да памылкі.

нешта бяспечнае будзе:

int * p = NULL;

калі (р! = NULL)

* р = 10;

Шчырлівы паказальнік: Як вынікае з назвы, гэта паказальнік, які паняцця не мае, дзе пазначыць, таму што блок памяці, які ён першапачаткова паказваў, нейкім чынам вызвалены.

Існуе шмат спосабаў павесіць паказальнік. Самым распаўсюджаным спосабам было б ствараць, капіяваць і выдаляць новыя

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

р = новы х;

q = р;

q выдаліць; // Указальнік блока памяці q і q выдаляецца з памяці

// адсюль у нас паказальнік p з адрасам, які не існуе ў памяці. Калі мы паспрабуем прысвоіць гэтаму паказальніку значэнне, мы ў бядзе, p паказальнік тут вісіць

* р = 10; // крах

Іншы спосаб, калі вы можаце выпадкова стварыць звісаючы паказальнік, - гэта зрабіць плоскую копію аб'екта альбо шляхам прысваення яго, альбо перадачы аб'екта метаду з выкарыстаннем канструктара копіі, які прадстаўляецца кампілятарам. Копія зроблена для вас.


адказ 5:

Я бачу тут шмат "ангельскіх", якія могуць спатрэбіцца таму, хто ўжо ведае гэтую канцэпцыю, але для тых, хто гэтага не ведае, гэта будзе не больш, чым ліхаманкавая лірыка. Аднак смешныя каэфіцыенты цікавяць адказы і метафары. Выбачайце, калі гэта кагосьці абражае.

Нулявы паказальнік: паказальнік, які змяшчае адрас ні да чаго альбо не кажа NULL. Пісаць у гэты момант - памылка. Гэта дазваляе прадухіліць выпадковае напісанне праграмістамі на месца, што можа прывесці да памылак сегментацыі і / або збояў. Указальнік заўсёды павінен быць ініцыялізаваны NULL і правераны на NULL перад напісаннем. Разгледзім гэты сцэнар:

Int * p; // У дадзены момант гэты паказальнік утрымлівае выпадковы адрас і можа спасылацца на любую пазіцыю, нават за межамі сегмента

* р = 10; // Гэта, безумоўна, прывядзе да памылкі.

нешта бяспечнае будзе:

int * p = NULL;

калі (р! = NULL)

* р = 10;

Шчырлівы паказальнік: Як вынікае з назвы, гэта паказальнік, які паняцця не мае, дзе пазначыць, таму што блок памяці, які ён першапачаткова паказваў, нейкім чынам вызвалены.

Існуе шмат спосабаў павесіць паказальнік. Самым распаўсюджаным спосабам было б ствараць, капіяваць і выдаляць новыя

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

р = новы х;

q = р;

q выдаліць; // Указальнік блока памяці q і q выдаляецца з памяці

// адсюль у нас паказальнік p з адрасам, які не існуе ў памяці. Калі мы паспрабуем прысвоіць гэтаму паказальніку значэнне, мы ў бядзе, p паказальнік тут вісіць

* р = 10; // крах

Іншы спосаб, калі вы можаце выпадкова стварыць звісаючы паказальнік, - гэта зрабіць плоскую копію аб'екта альбо шляхам прысваення яго, альбо перадачы аб'екта метаду з выкарыстаннем канструктара копіі, які прадстаўляецца кампілятарам. Копія зроблена для вас.


адказ 6:

Я бачу тут шмат "ангельскіх", якія могуць спатрэбіцца таму, хто ўжо ведае гэтую канцэпцыю, але для тых, хто гэтага не ведае, гэта будзе не больш, чым ліхаманкавая лірыка. Аднак смешныя каэфіцыенты цікавяць адказы і метафары. Выбачайце, калі гэта кагосьці абражае.

Нулявы паказальнік: паказальнік, які змяшчае адрас ні да чаго альбо не кажа NULL. Пісаць у гэты момант - памылка. Гэта дазваляе прадухіліць выпадковае напісанне праграмістамі на месца, што можа прывесці да памылак сегментацыі і / або збояў. Указальнік заўсёды павінен быць ініцыялізаваны NULL і правераны на NULL перад напісаннем. Разгледзім гэты сцэнар:

Int * p; // У дадзены момант гэты паказальнік утрымлівае выпадковы адрас і можа спасылацца на любую пазіцыю, нават за межамі сегмента

* р = 10; // Гэта, безумоўна, прывядзе да памылкі.

нешта бяспечнае будзе:

int * p = NULL;

калі (р! = NULL)

* р = 10;

Шчырлівы паказальнік: Як вынікае з назвы, гэта паказальнік, які паняцця не мае, дзе пазначыць, таму што блок памяці, які ён першапачаткова паказваў, нейкім чынам вызвалены.

Існуе шмат спосабаў павесіць паказальнік. Самым распаўсюджаным спосабам было б ствараць, капіяваць і выдаляць новыя

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

р = новы х;

q = р;

q выдаліць; // Указальнік блока памяці q і q выдаляецца з памяці

// адсюль у нас паказальнік p з адрасам, які не існуе ў памяці. Калі мы паспрабуем прысвоіць гэтаму паказальніку значэнне, мы ў бядзе, p паказальнік тут вісіць

* р = 10; // крах

Іншы спосаб, калі вы можаце выпадкова стварыць звісаючы паказальнік, - гэта зрабіць плоскую копію аб'екта альбо шляхам прысваення яго, альбо перадачы аб'екта метаду з выкарыстаннем канструктара копіі, які прадстаўляецца кампілятарам. Копія зроблена для вас.


адказ 7:

Я бачу тут шмат "ангельскіх", якія могуць спатрэбіцца таму, хто ўжо ведае гэтую канцэпцыю, але для тых, хто гэтага не ведае, гэта будзе не больш, чым ліхаманкавая лірыка. Аднак смешныя каэфіцыенты цікавяць адказы і метафары. Выбачайце, калі гэта кагосьці абражае.

Нулявы паказальнік: паказальнік, які змяшчае адрас ні да чаго альбо не кажа NULL. Пісаць у гэты момант - памылка. Гэта дазваляе прадухіліць выпадковае напісанне праграмістамі на месца, што можа прывесці да памылак сегментацыі і / або збояў. Указальнік заўсёды павінен быць ініцыялізаваны NULL і правераны на NULL перад напісаннем. Разгледзім гэты сцэнар:

Int * p; // У дадзены момант гэты паказальнік утрымлівае выпадковы адрас і можа спасылацца на любую пазіцыю, нават за межамі сегмента

* р = 10; // Гэта, безумоўна, прывядзе да памылкі.

нешта бяспечнае будзе:

int * p = NULL;

калі (р! = NULL)

* р = 10;

Шчырлівы паказальнік: Як вынікае з назвы, гэта паказальнік, які паняцця не мае, дзе пазначыць, таму што блок памяці, які ён першапачаткова паказваў, нейкім чынам вызвалены.

Існуе шмат спосабаў павесіць паказальнік. Самым распаўсюджаным спосабам было б ствараць, капіяваць і выдаляць новыя

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

р = новы х;

q = р;

q выдаліць; // Указальнік блока памяці q і q выдаляецца з памяці

// адсюль у нас паказальнік p з адрасам, які не існуе ў памяці. Калі мы паспрабуем прысвоіць гэтаму паказальніку значэнне, мы ў бядзе, p паказальнік тут вісіць

* р = 10; // крах

Іншы спосаб, калі вы можаце выпадкова стварыць звісаючы паказальнік, - гэта зрабіць плоскую копію аб'екта альбо шляхам прысваення яго, альбо перадачы аб'екта метаду з выкарыстаннем канструктара копіі, які прадстаўляецца кампілятарам. Копія зроблена для вас.


адказ 8:

Я бачу тут шмат "ангельскіх", якія могуць спатрэбіцца таму, хто ўжо ведае гэтую канцэпцыю, але для тых, хто гэтага не ведае, гэта будзе не больш, чым ліхаманкавая лірыка. Аднак смешныя каэфіцыенты цікавяць адказы і метафары. Выбачайце, калі гэта кагосьці абражае.

Нулявы паказальнік: паказальнік, які змяшчае адрас ні да чаго альбо не кажа NULL. Пісаць у гэты момант - памылка. Гэта дазваляе прадухіліць выпадковае напісанне праграмістамі на месца, што можа прывесці да памылак сегментацыі і / або збояў. Указальнік заўсёды павінен быць ініцыялізаваны NULL і правераны на NULL перад напісаннем. Разгледзім гэты сцэнар:

Int * p; // У дадзены момант гэты паказальнік утрымлівае выпадковы адрас і можа спасылацца на любую пазіцыю, нават за межамі сегмента

* р = 10; // Гэта, безумоўна, прывядзе да памылкі.

нешта бяспечнае будзе:

int * p = NULL;

калі (р! = NULL)

* р = 10;

Шчырлівы паказальнік: Як вынікае з назвы, гэта паказальнік, які паняцця не мае, дзе пазначыць, таму што блок памяці, які ён першапачаткова паказваў, нейкім чынам вызвалены.

Існуе шмат спосабаў павесіць паказальнік. Самым распаўсюджаным спосабам было б ствараць, капіяваць і выдаляць новыя

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

р = новы х;

q = р;

q выдаліць; // Указальнік блока памяці q і q выдаляецца з памяці

// адсюль у нас паказальнік p з адрасам, які не існуе ў памяці. Калі мы паспрабуем прысвоіць гэтаму паказальніку значэнне, мы ў бядзе, p паказальнік тут вісіць

* р = 10; // крах

Іншы спосаб, калі вы можаце выпадкова стварыць звісаючы паказальнік, - гэта зрабіць плоскую копію аб'екта альбо шляхам прысваення яго, альбо перадачы аб'екта метаду з выкарыстаннем канструктара копіі, які прадстаўляецца кампілятарам. Копія зроблена для вас.


адказ 9:

Я бачу тут шмат "ангельскіх", якія могуць спатрэбіцца таму, хто ўжо ведае гэтую канцэпцыю, але для тых, хто гэтага не ведае, гэта будзе не больш, чым ліхаманкавая лірыка. Аднак смешныя каэфіцыенты цікавяць адказы і метафары. Выбачайце, калі гэта кагосьці абражае.

Нулявы паказальнік: паказальнік, які змяшчае адрас ні да чаго альбо не кажа NULL. Пісаць у гэты момант - памылка. Гэта дазваляе прадухіліць выпадковае напісанне праграмістамі на месца, што можа прывесці да памылак сегментацыі і / або збояў. Указальнік заўсёды павінен быць ініцыялізаваны NULL і правераны на NULL перад напісаннем. Разгледзім гэты сцэнар:

Int * p; // У дадзены момант гэты паказальнік утрымлівае выпадковы адрас і можа спасылацца на любую пазіцыю, нават за межамі сегмента

* р = 10; // Гэта, безумоўна, прывядзе да памылкі.

нешта бяспечнае будзе:

int * p = NULL;

калі (р! = NULL)

* р = 10;

Шчырлівы паказальнік: Як вынікае з назвы, гэта паказальнік, які паняцця не мае, дзе пазначыць, таму што блок памяці, які ён першапачаткова паказваў, нейкім чынам вызвалены.

Існуе шмат спосабаў павесіць паказальнік. Самым распаўсюджаным спосабам было б ствараць, капіяваць і выдаляць новыя

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

р = новы х;

q = р;

q выдаліць; // Указальнік блока памяці q і q выдаляецца з памяці

// адсюль у нас паказальнік p з адрасам, які не існуе ў памяці. Калі мы паспрабуем прысвоіць гэтаму паказальніку значэнне, мы ў бядзе, p паказальнік тут вісіць

* р = 10; // крах

Іншы спосаб, калі вы можаце выпадкова стварыць звісаючы паказальнік, - гэта зрабіць плоскую копію аб'екта альбо шляхам прысваення яго, альбо перадачы аб'екта метаду з выкарыстаннем канструктара копіі, які прадстаўляецца кампілятарам. Копія зроблена для вас.


адказ 10:

Я бачу тут шмат "ангельскіх", якія могуць спатрэбіцца таму, хто ўжо ведае гэтую канцэпцыю, але для тых, хто гэтага не ведае, гэта будзе не больш, чым ліхаманкавая лірыка. Аднак смешныя каэфіцыенты цікавяць адказы і метафары. Выбачайце, калі гэта кагосьці абражае.

Нулявы паказальнік: паказальнік, які змяшчае адрас ні да чаго альбо не кажа NULL. Пісаць у гэты момант - памылка. Гэта дазваляе прадухіліць выпадковае напісанне праграмістамі на месца, што можа прывесці да памылак сегментацыі і / або збояў. Указальнік заўсёды павінен быць ініцыялізаваны NULL і правераны на NULL перад напісаннем. Разгледзім гэты сцэнар:

Int * p; // У дадзены момант гэты паказальнік утрымлівае выпадковы адрас і можа спасылацца на любую пазіцыю, нават за межамі сегмента

* р = 10; // Гэта, безумоўна, прывядзе да памылкі.

нешта бяспечнае будзе:

int * p = NULL;

калі (р! = NULL)

* р = 10;

Шчырлівы паказальнік: Як вынікае з назвы, гэта паказальнік, які паняцця не мае, дзе пазначыць, таму што блок памяці, які ён першапачаткова паказваў, нейкім чынам вызвалены.

Існуе шмат спосабаў павесіць паказальнік. Самым распаўсюджаным спосабам было б ствараць, капіяваць і выдаляць новыя

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

р = новы х;

q = р;

q выдаліць; // Указальнік блока памяці q і q выдаляецца з памяці

// адсюль у нас паказальнік p з адрасам, які не існуе ў памяці. Калі мы паспрабуем прысвоіць гэтаму паказальніку значэнне, мы ў бядзе, p паказальнік тут вісіць

* р = 10; // крах

Іншы спосаб, калі вы можаце выпадкова стварыць звісаючы паказальнік, - гэта зрабіць плоскую копію аб'екта альбо шляхам прысваення яго, альбо перадачы аб'екта метаду з выкарыстаннем канструктара копіі, які прадстаўляецца кампілятарам. Копія зроблена для вас.