2015-01-05 4 views
0

Я давал интервью в компании, и они спрашивали меня: «Что такое приложения нулевых указателей в C»? Я сказал им, что такое нулевой указатель и как он приводит к ошибке сегментации. Однако они были недовольны ответом. Я никогда не слышал ничего подобного раньше. Если у кого-нибудь есть идеи, пожалуйста, поделитесь.Применение нулевой указатель

Спасибо

+2

Как это ведет к segfault? Я думал, что это происходит только тогда, когда вы пытаетесь его уважать, потому что на самом деле это не указывает на что-либо в памяти, а значит, на segfault. Но да + 1 для этого вопроса. Единственное приложение, о котором я могу думать, это указать его как маркер, чтобы указать, что указатель не был выделен памятью или как сигнал сбоя в этой ситуации. – rurouni88

+0

в C++ мы использовали их для обозначения конца или начала цепочечных структур данных - хм. Я ненавижу интервью (er) вопросы – terary

ответ

3

они спрашивали, когда вам нужно использовать NULL указатели, не тогда, когда они приводят к проблемам.

Классический ответ заключается в том, что они используются, когда на что нечего указывать. Например, следующий указатель в списке, когда его конец списка -> нет следующего элемента.

и поэтому в вашем коде вы идете

if(nextItem != NULL) 
{ 
    // do stuff with nextItem 
} 
else 
{ 
// the end 
} 

Как mooseboy указывает это значение сторожевого т.е., специальное значение, что ваш код признает как имеющие решающее значение.

NULL является предполагается, никогда не быть допустимым значением для указателя (например, вы не можете использовать 0x000042, так как 42 может быть реальный адрес)

+0

При использовании таким образом вы используете NULL (0) в качестве [дозорного значения] (http://en.wikipedia.org/wiki/Sentinel_value). Он не * действительно * означает адрес '0x00000000', он имеет особое значение. – MooseBoys

+0

@MooseBoys: кто говорил об адресе 0? В C NULL есть * по определению * sentinel value (это значение указателя, которое не является ловушным представлением, которое гарантируется, что оно не будет приниматься каким-либо действительным объектом и которое приведет к неопределенному поведению при разыменовании), который в принципе имеет ничего не делать с адресом 0 адресного пространства. –

+0

@ Matteo - это не было меня, но FYI. Я вырос на машине, где NULL был 0xFFFFFFFF – pm100

-3

Этот вопрос вроде расплывчато идеальный указатель дозорного, так как NULL, но одна вещь, которую они, возможно, были недовольны, заключается в том, что с чистой точки зрения, разыменование NULL не гарантирует, что вы получите segfault. Это вызывает неуказанное поведение, то есть язык не говорит, что произойдет. На большинстве платформ да, нулевая ссылка вызывает segfault, но реализация C может сделать что-то еще и по-прежнему соответствовать стандарту.

+1

Вы уверены, что на большинстве платформ есть ПК или, по крайней мере, есть MMU? Есть гораздо больше встроенных систем ... – Deduplicator

+0

Вопрос помечен как C, а в Linux попытка оповестить нулевой указатель приводит к согласованному поведению == segfault :) Вы все же правы. Windows и другие ОС могут вести себя по-другому – rurouni88

+3

@ rurouni88: Не совсем, даже если вы сделаете абсолютно необоснованное предположение об использовании Linux. Один * может * отображать 0-адрес, с достаточным количеством привилегий, и в любом случае на стороне ядра все еще интереснее. – Deduplicator