2011-12-17 1 views
1

, что происходит в памяти, когда я, скажем, сделать следующее:
в C: char *c=NULL;
в Java: MyClass mc=null;
, что происходит в памяти, как это null представлена ​​в памяти в обоих этих языках? СпасибоЧто происходит при присвоении нулевого символа?

+0

В Java вы не можете сказать «нулевой символ». Его нулевое значение. – Lion

+0

В C вам нужно включить хотя бы один из нескольких заголовков для 'NULL', чтобы существовать со значением, которое вы предполагаете. 'NULL' - общий идентификатор, который может означать что угодно (** он не должен **) программист хочет. – pmg

+0

нулевой символ в C - совершенно другая концепция, название вашего вопроса совершенно неверно по сравнению с вашими примерами. –

ответ

4

В C вы в основном устанавливаете указатель на нулевое значение. На самом деле

char *c = NULL; 

эквивалентно

char *c = 0; 

нулевой указатель не может быть разыменовываются, так как нет никакого отображения памяти для этого адреса. На платформах с виртуальной памятью попытка сделать это приводит к тому, что управление операциями передачи страниц вызывает операционную систему, которая обычно обрабатывает ситуацию, убивая процесс нарушения (в UNIX ваш процесс получает сигнал нарушения сегментации SIGSEGV).

В Java все не примитивные переменные типа являются ссылками. null в Java - это буквальное обозначение единственного значения специального неназванного типа. Этот тип может быть переведен на любой ссылочный тип, позволяющий помещать null в любую ссылочную переменную. Попытка использовать такую ​​ссылку для доступа к объекту вызовет неконтролируемое исключение, которое называется NullPointerException. См. JLS 3.10.7 и JLS 4.1.

+0

отличный ответ, спасибо большое. – Will

+0

@ В большинстве операционных систем это приведет к сбою страницы. На некоторых ничего не происходит или что-то ужасное вообще, но нет ошибки страницы. –

+0

Правильно. Некоторые операционные системы реального времени и встроенные операционные системы не используют виртуальную память, поэтому ошибка страницы не может произойти. Даже некоторые современные основные операционные системы, такие как Linux, даже могут быть настроены не на использование виртуальной памяти, но это используется в специализированных встроенных приложениях, часто работающих на оборудовании без MMU. DSP являются распространенным примером здесь. Я сделал текст более ясным. –

-1

NULL - это особое значение, указывающее, что в этом месте нет данных, его конкретное представление может отличаться. в C это всего лишь 0, я точно знаю о java.

+0

Нет, 'NULL' - это адрес, как любой другой. Это просто очень удобно для тестов, так как вы можете проверить 'if (!p) 'где' p' равно NULL. – fge

+0

В C концепция нулевого указателя может быть представлена ​​несколькими способами: наиболее обычным способом является «NULL» («NULL' не обязательно« 0 »); другими способами являются '0',' (void *) 0'. Два значения нулевого указателя сравниваются друг с другом независимо от того, как они получили свое значение. – pmg

+0

он не спрашивал только о C, я пытался дать общий ответ. – yurib

1

Что вы здесь делаете, это назначение знака - NULL.

Он имеет в основном тот же эффект, с огромной разницей в том, что разыменование NULL в C сделает вашу программу умирающей с SIGSEGV (ну, в Unix-подобных операционных системах, включая Linux и Mac OS X), в то время как Java будет NullPointerException.

Обратите внимание, что mc действительно является ссылкой, а не классом. Это почти то же самое, что и указатель C.

В любом случае NULL имеет практическое значение в обоих случаях: вы можете проверить if (mc == null) на Java. В C это будет простой if (!p) (но также работает if (p == NULL)).

Смежные вопросы