, что происходит в памяти, когда я, скажем, сделать следующее:
в C: char *c=NULL;
в Java: MyClass mc=null;
, что происходит в памяти, как это null
представлена в памяти в обоих этих языках? СпасибоЧто происходит при присвоении нулевого символа?
ответ
В C вы в основном устанавливаете указатель на нулевое значение. На самом деле
char *c = NULL;
эквивалентно
char *c = 0;
нулевой указатель не может быть разыменовываются, так как нет никакого отображения памяти для этого адреса. На платформах с виртуальной памятью попытка сделать это приводит к тому, что управление операциями передачи страниц вызывает операционную систему, которая обычно обрабатывает ситуацию, убивая процесс нарушения (в UNIX ваш процесс получает сигнал нарушения сегментации SIGSEGV
).
В Java все не примитивные переменные типа являются ссылками. null
в Java - это буквальное обозначение единственного значения специального неназванного типа. Этот тип может быть переведен на любой ссылочный тип, позволяющий помещать null
в любую ссылочную переменную. Попытка использовать такую ссылку для доступа к объекту вызовет неконтролируемое исключение, которое называется NullPointerException
. См. JLS 3.10.7 и JLS 4.1.
отличный ответ, спасибо большое. – Will
@ В большинстве операционных систем это приведет к сбою страницы. На некоторых ничего не происходит или что-то ужасное вообще, но нет ошибки страницы. –
Правильно. Некоторые операционные системы реального времени и встроенные операционные системы не используют виртуальную память, поэтому ошибка страницы не может произойти. Даже некоторые современные основные операционные системы, такие как Linux, даже могут быть настроены не на использование виртуальной памяти, но это используется в специализированных встроенных приложениях, часто работающих на оборудовании без MMU. DSP являются распространенным примером здесь. Я сделал текст более ясным. –
NULL - это особое значение, указывающее, что в этом месте нет данных, его конкретное представление может отличаться. в C это всего лишь 0, я точно знаю о java.
Нет, 'NULL' - это адрес, как любой другой. Это просто очень удобно для тестов, так как вы можете проверить 'if (!p) 'где' p' равно NULL. – fge
В C концепция нулевого указателя может быть представлена несколькими способами: наиболее обычным способом является «NULL» («NULL' не обязательно« 0 »); другими способами являются '0',' (void *) 0'. Два значения нулевого указателя сравниваются друг с другом независимо от того, как они получили свое значение. – pmg
он не спрашивал только о C, я пытался дать общий ответ. – yurib
Что вы здесь делаете, это назначение знака - NULL
.
Он имеет в основном тот же эффект, с огромной разницей в том, что разыменование NULL в C сделает вашу программу умирающей с SIGSEGV
(ну, в Unix-подобных операционных системах, включая Linux и Mac OS X), в то время как Java будет NullPointerException
.
Обратите внимание, что mc
действительно является ссылкой, а не классом. Это почти то же самое, что и указатель C.
В любом случае NULL имеет практическое значение в обоих случаях: вы можете проверить if (mc == null)
на Java. В C это будет простой if (!p)
(но также работает if (p == NULL)
).
Вы можете найти ответ на следующие должности:
What exactly is null in Java memory
Java - Does null variable require space in memory
Так в основном, сам нуль не занимает места, но объекта положить равным NULL действительно занимает пространство
спасибо за ответ :) – Will
- 1. Что такое литерал нулевого символа в TSQL?
- 2. Неуверенные, что PHP массив делают при присвоении
- 3. Что происходит при сбое активности
- 4. Внешнее наследование дублирует ошибки символа, что происходит?
- 5. Файл содержит два символа EOF; что происходит?
- 6. Удаление нулевого символа из файла
- 7. Что происходит при обновлении?
- 8. Что происходит при вводе
- 9. Обход нулевого символа из scanf
- 10. Что происходит быстрее: проверка нулевого указателя или вызов пустой функции?
- 11. bash: при присвоении результата переменной
- 12. Что происходит при создании строки в smalltalk?
- 13. Что происходит при перетаскивании экрана?
- 14. Что происходит при вызове QueryPerformanceCounter?
- 15. Что происходит при перенаправлении unique_ptr?
- 16. Что происходит при живой миграции
- 17. Что происходит при подключении.setAutoCommit = false
- 18. Что происходит при закрытии ServerSocket
- 19. Что происходит при ошибке GetMessage?
- 20. Что происходит при объединении индекса?
- 21. Что происходит при загрузке каталога?
- 22. Что происходит при объявлении переменной?
- 23. Что происходит при использовании DISTINCT?
- 24. Ошибка при присвоении значению свойства
- 25. Переполнение не обнаружено при записи нулевого символа в середине строки?
- 26. Печать нулевого символа при вводе нечетного количества символов
- 27. Побег нулевого символа в цифровом формате
- 28. Значения мусора печатаются даже после нулевого символа
- 29. Проблема передачи нулевого символа над сокетами
- 30. инициализация указателя символа по сравнению с не указателем? Что происходит
В Java вы не можете сказать «нулевой символ». Его нулевое значение. – Lion
В C вам нужно включить хотя бы один из нескольких заголовков для 'NULL', чтобы существовать со значением, которое вы предполагаете. 'NULL' - общий идентификатор, который может означать что угодно (** он не должен **) программист хочет. – pmg
нулевой символ в C - совершенно другая концепция, название вашего вопроса совершенно неверно по сравнению с вашими примерами. –