33 / 59 / 6
Регистрация: 22.01.2017
Сообщений: 640
1

Что не так с нулевыми указателями?

07.08.2017, 23:44. Показов 1269. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В новых языках часто от них отказываются(читай: Rust). А что с ними не так? По моему они нужны.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.08.2017, 23:44
Ответы с готовыми решениями:

Что не так с этими указателями?
Всем привет, прошу помощи разобраться в коде. Недавно начал изучать C++ по книге Лафоре. В главе с...

Что не так при работе с указателями?
Здравствуйте! Начинаю изучать работу с указателями. #include <iostream> using namespace...

Работа с указателями: подскажите что я не так делаю
Добрый день Подскажите пожалуйста что в этой программе не так #include <iostream> using...

Можно лм так работать со списками и указателями?
Задание: Реализовать ведение списка забронированных и списка купленных билетов в кинозале...

26
1287 / 880 / 254
Регистрация: 30.06.2015
Сообщений: 4,596
Записей в блоге: 51
08.08.2017, 12:01 2
Цитата Сообщение от Luke0208 Посмотреть сообщение
А что с ними не так? По моему они нужны.
Нулевой указатель должен содержать макроопределение NULL, что должно в принципе гарантировать, что данный указатель не указывает ни на один физический(или виртуальный) адрес, то есть указывает в никуда. Если бы это было не так, то программы перестали бы работать корректно. Так что это очень полезная штука применительно к конкретному языку си. О других языках ничего не могу сказать.
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
08.08.2017, 15:27 3
Указатели - это про ручную работу с памятью. Много вы знаете языков, поддерживающих такое? Даже в С++ этого нет, оставлено только в качестве совместимости с Си, про Раст не знаю. Но можно перевести вопрос в другие языки
- зачем нужен null? В новых языках часто от них отказываются(читай: Котлин). А что с ними не так? По моему они нужны.
Так вот, принято считать, что от них больше вреда, чем пользы - забыл проверить значение на null, полез читать поля и вызывать методы, словил падение в рантайме (точно так же, как и при разыменовывании нулевого указателя в Си). С одной стороны удобно - можно использовать как отсутствующее значение. С другой - статистика ошибок говорит о том, что программисты невнимательны и часто это бьет им по лбу. Поэтому и стараются сделать так, чтобы язык максимально ограничивал возможности программиста накосячить. А не заданные значения реализуют через разнообразные другие концепции.

Добавлено через 12 минут
UPD просто Си - это язык с динамической типизацией (хотя распространенное мнение на этот счет другое). А в языках с такой типизацией ты никогда не можешь быть уверен, что в данной переменной лежит то что надо. Поэтому либо делается куча проверок, либо предполагается, что там всегда корректные данные, и проверок не делается - но когда предположения нарушаются, получается фэйл. В сильно статически типизированных языках все переменные всегда содержат данные нужных типов, за этим следит компилятор - считается, что это помощь программисту. Но и всякие перекасты/хаки становится сделать сложнее или вообще невозможно.
0
33 / 59 / 6
Регистрация: 22.01.2017
Сообщений: 640
08.08.2017, 17:27  [ТС] 4
С - язык с динамической типизацией? Вы это случайно написали?
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
08.08.2017, 17:30 5
Я видел ваши темы в других разделах, понимаю, что вы знатный тролль, но отвечу - нет, я это написал не случайно а специально
0
33 / 59 / 6
Регистрация: 22.01.2017
Сообщений: 640
08.08.2017, 17:34  [ТС] 6
Знатный тролль? Простите, но все мои темы были вызваны моей некомпетентностью, а не антисоциальными побуждениями.
0
1287 / 880 / 254
Регистрация: 30.06.2015
Сообщений: 4,596
Записей в блоге: 51
08.08.2017, 17:42 7
Лучший ответ Сообщение было отмечено Luke0208 как решение

Решение

Цитата Сообщение от _Ivana Посмотреть сообщение
Так вот, принято считать, что от них больше вреда, чем пользы - забыл проверить значение на null, полез читать поля и вызывать методы, словил падение в рантайме (точно так же, как и при разыменовывании нулевого указателя в Си).
Принято считать из каких языков? Для си эти мнения не имеют значения, как и для асма тоже. Все эти высокоуровневые ЯП делаются из низкоуровневых ЯП с применением NULL и всего прочего, неприглядного. Клетки имеют свои законы поведения, в отличие от атомов.
Прямая работа с памятью требует своих законов и инструментов.
0
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
08.08.2017, 20:09 8
Цитата Сообщение от _Ivana Посмотреть сообщение
понимаю, что вы знатный тролль,
Но судя по вашему первому сообщение, то знатный тролль в данный момент это вы
Цитата Сообщение от _Ivana Посмотреть сообщение
это про ручную работу с памятью
Цитата Сообщение от _Ivana Посмотреть сообщение
Даже в С++ этого нет
Цитата Сообщение от _Ivana Посмотреть сообщение
просто Си - это язык с динамической типизацией
0
33 / 59 / 6
Регистрация: 22.01.2017
Сообщений: 640
08.08.2017, 20:20  [ТС] 9
Кажется в правилах форума нельзя вводить в заблуждение.
Цитата Сообщение от _Ivana Посмотреть сообщение
просто Си - это язык с динамической типизацией
И прочее.
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
08.08.2017, 21:56 10
Цитата Сообщение от Luke0208 Посмотреть сообщение
В новых языках часто от них отказываются(читай: Rust)
Я с Rust'ом не знаком, а потому немного глупый вопрос: а там указатель - это настоящий указатель или что?

Просто ссылка Си++ по своей сути есть указатель. Но есть одно очень важное отличие - с ссылкой нельзя выполнять никаких действий, кроме её разыменования. И, соответственно, ссылка в момент рождения может смотреть только на какой-то объект, а потому она, в отличие от указателя, не может иметь нулевое значение адреса (правда проблема зависших ссылок всё равно остаётся). Хотелось понять, в Rust'е понятие "указатель" такое же, или нет
-0.50
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
08.08.2017, 22:35 11
Цитата Сообщение от Luke0208 Посмотреть сообщение
Кажется в правилах форума нельзя вводить в заблуждение
Ты как маленький Здесь почти все только этим и занимаются, причем в большинстве случаев делают это с искренней уверенностью в своих заблуждениях. Впрочем, свое мнение не навязываю - я понимаю, что вам ваши заблуждения дороги как память (или ее линейная модель с ручным управлением ), поэтому от дискуссии отписываюсь
0
Эксперт функциональных языков программированияЭксперт Java
4487 / 2722 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
08.08.2017, 22:56 12
Цитата Сообщение от Luke0208 Посмотреть сообщение
В новых языках часто от них отказываются(читай: Rust). А что с ними не так?
I call it my billion-dollar mistake. It was the invention of the null reference in 1965. At that time, I was designing the first comprehensive type system for references in an object oriented language (ALGOL W). My goal was to ensure that all use of references should be absolutely safe, with checking performed automatically by the compiler. But I couldn't resist the temptation to put in a null reference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years.
billion-dollar mistake

Но в Rust они, вроде как, есть, хотя, как я понял, это сильно не то же самое, что null pointer в Си. Не знаю, насколько принято их использовать.

Цитата Сообщение от Luke0208 Посмотреть сообщение
По моему они нужны.
Зачем? Перехватывать NPE?

Цитата Сообщение от _Ivana Посмотреть сообщение
Даже в С++ этого нет
Чего? «В основном не пользуются» и «нет» — не одно и то же.

Цитата Сообщение от _Ivana Посмотреть сообщение
С одной стороны удобно - можно использовать как отсутствующее значение.
Для этого есть безопасный Optional.

Цитата Сообщение от _Ivana Посмотреть сообщение
это язык со слабой типизацией
FIXED.

Цитата Сообщение от _Ivana Посмотреть сообщение
В новых языках часто от них отказываются(читай: Котлин)
ML очень новый язык, да…

Цитата Сообщение от Evg Посмотреть сообщение
Просто ссылка Си++ по своей сути есть указатель.
Нет, сильно нет.

Цитата Сообщение от Evg Посмотреть сообщение
Но есть одно очень важное отличие - с ссылкой нельзя выполнять никаких действий, кроме её разыменования.
Ссылку в C++ не разыменовывают, она уже «разыменована».

Цитата Сообщение от Evg Посмотреть сообщение
Хотелось понять, в Rust'е понятие "указатель" такое же, или нет
Судя по всему — нет, не такое же, как в Си, если ты имел в виду Си.
1
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.08.2017, 00:18 13
Цитата Сообщение от korvin_ Посмотреть сообщение
Нет, сильно нет
С точки зрения конечного кода - сильно да. Даже однозначно да

Цитата Сообщение от korvin_ Посмотреть сообщение
Ссылку в C++ не разыменовывают, она уже «разыменована»
В языке - да. В коде - нет. В коде происходит именно разыменование кода

Цитата Сообщение от korvin_ Посмотреть сообщение
Судя по всему — нет, не такое же, как в Си, если ты имел в виду Си
Да. Имел в виду это. Т.е. там указатель по смыслу не является "адресом"? Видимо, он ближе к ссылке Си++? Вероятно потому и нету там такого понятия, как нулевой указатель, поскольку, вероятно, указатель обязательно ассоциирован с конкретным объектом, а не просто адрес, который можно крутить-вертеть как угодно

Добавлено через 1 минуту
Не заметил ссылку в начале поста #12. Нет, тут видимо не то
-0.50
Эксперт функциональных языков программированияЭксперт Java
4487 / 2722 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
09.08.2017, 02:36 14
Цитата Сообщение от Evg Посмотреть сообщение
С точки зрения конечного кода - сильно да. Даже однозначно да
Нет. Вообще нет. Указатель — самостоятельное значение, ссылка — нет.

Цитата Сообщение от Evg Посмотреть сообщение
В языке - да
Нет.

Цитата Сообщение от Evg Посмотреть сообщение
В коде происходит именно разыменование кода
Разыменовывание кода? Чего? С тем же успехом можно утверждать, что происходит разыменовывание всех переменных, но зачем тогда вообще сравнение с указателем?
1
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.08.2017, 09:54 15
Цитата Сообщение от korvin_ Посмотреть сообщение
Нет. Вообще нет
Господи, неужто так сложно проверить

C
/* файл t.c */
void foo (int *x, int *y)
{
  *x = *y;
}
C++
/* файл t.cc */
void foo (int &x, int &y)
{
  x = y;
}
Код
$ gcc -O3 t.c -S
$ cat t.s
...
foo:
        pushl   %ebp
        movl    %esp, %ebp
        movl    12(%ebp), %eax
        movl    (%eax), %edx
        movl    8(%ebp), %eax
        movl    %edx, (%eax)
        popl    %ebp
        ret
...
Код
$ g++ -O3 t.cc -S
$ cat t.s
...
_Z3fooRiS_:
.LFB2:
        pushl   %ebp
.LCFI0:
        movl    %esp, %ebp
.LCFI1:
        movl    12(%ebp), %eax
        movl    (%eax), %edx
        movl    8(%ebp), %eax
        movl    %edx, (%eax)
        popl    %ebp
        ret
.LFE2:
...
Покажи мне пальцем, где ты видишь хоть одно отличие. Покажи мне пальцем туда, где ты видишь, что ссылка на уровне кода это вообще не указатель. Покажи мне пальцем туда, где нету никакого разыменования
0
Неэпический
17871 / 10638 / 2054
Регистрация: 27.09.2012
Сообщений: 26,753
Записей в блоге: 1
09.08.2017, 10:23 16
Evg, и указатель и ссылка оперируют адресом,
но это не значит что ссылка это указатель.
В машинный код загляните, там указателей-то тоже нет.
Какие-то числа всего-лишь.
И ссылка и указатель оперируют одной сущностью - адресом,
но это два разных механизма.
0
Evg
09.08.2017, 10:30
  #17

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
но это не значит что ссялка это указатель
Я же не говорю, что ссылка есть указатель. Я говорю о том, что ссылка по своему смыслу есть указатель с точки зрения машинного кода. Правда люди, не разбирающиеся в машинных кодах предпочитают их считать синонимами, а не указателями, но при этом они почему-то никак не хотят понять, что синоним не может родиться без указателя

Задавая вопрос в посте #10 у меня были опасения, что начнётся очередной стандартный срач на тему того, что такое ссылка в Си++. С другой стороны до того уже начался срач на тему того, является ли Си языком с динамической типизацией. Видимо,
тема заранее была обречена на то, чтобы стать помойкой

0
Croessmah
09.08.2017, 10:50
  #18

Не по теме:

Цитата Сообщение от Evg Посмотреть сообщение
Я говорю о том, что ссылка по своему смыслу есть указатель с точки зрения машинного кода.
Но не с точки зрения языка.
С точки зрения машинного кода это вообще всё числа.
Ассемблер - это тоже абстракция.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void foo1 (int *x, int *y)
{
  *x = *y;
}
 
 
void foo2 (int &x, int &y)
{
  x = y;
}
 
void foo3 (intptr_t x, intptr_t y)
{
  *reinterpret_cast<int*>(x) = *reinterpret_cast<int*>(y);
}
получаем
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
foo1(int*, int*):
  mov eax, DWORD PTR [rsi]
  mov DWORD PTR [rdi], eax
  ret
foo2(int&, int&):
  mov eax, DWORD PTR [rsi]
  mov DWORD PTR [rdi], eax
  ret
foo3(long, long):
  mov eax, DWORD PTR [rsi]
  mov DWORD PTR [rdi], eax
  ret
Цитата Сообщение от Evg Посмотреть сообщение
Правда люди, не разбирающиеся в машинных кодах предпочитают их считать синонимами
1. Такое определение вводит стандарт.
2. Семантика ссылок навязывает такое предположение.
3. С таким определением значительно проще работать.
4. Стандарт не описывает внутреннюю реализацию ссылок.
Цитата Сообщение от Evg Посмотреть сообщение
но при этом они почему-то никак не хотят понять, что синоним не может родиться без указателя
Всё они прекрасно понимают.
Просто те, кто рассматривают ссылки через
указатели смотрят на C++ через призму C,
что и не позволяет им принять ссылки как отдельный механизм.
Они стараются всё с точки зрения с рассматривать.
Если C чего-то не объясняет, то обращаются к ассемблеру.
Но почему-то никто не хочет обратится к еще более низкому уровню,
и посмотреть, что указателей не бывает. :D
Указатель - это такая же абстракция над адресом, как и ссылка.
Указатель оперирует адресом.
Адрес - лишь число/числа (или что там еще может быть),
которое интерпретируется как положение/смещение где-то.
Два разных механизма - ссылки и указатели используют
одну основу, но используют её по разному.
Из-за этого получается значительная разница на уровне языка.
Вот как-то так.
Цитата Сообщение от Evg Посмотреть сообщение
Задавая вопрос в посте #10 у меня были опасения, что начнётся очередной стандартный срач на тему того, что такое ссылка в Си++
Ну а как же без этого? :D
Цитата Сообщение от Evg Посмотреть сообщение
является ли Си языком с динамической типизацией.
Ну это вообще какой-то вброс. :)

1
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.08.2017, 12:28 19

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
Но почему-то никто не хочет обратится к еще более низкому уровню
В контексте данной темы не было смысла. Вопрос был о языке Rust. У меня появилось предположение, почему в нём нет null-указателя. Предположил, что причина та же, почему в Си++ нет null-ссылок (надеюсь, в С++ не появилось никаких новых стандартов, в которых подобные вещи появились бы). Правда ссылка из поста #12 наводит на мысли о том, что это не так. Точнее, даже на мысли о том, что изначальный вопрос был поставлен некорректно (т.е. null-указатель в Rust'е всё-таки есть, если я правильно понял)

Цитата Сообщение от Croessmah Посмотреть сообщение
Просто те, кто рассматривают ссылки через указатели смотрят на C++ через призму C, что и не позволяет им принять ссылки как отдельный механизм.
Если это был камень в мой огород, то я не смотрю на Си++ сквозь призму Си. Язык Си для меня в данном случае лишь инструмент, через который можно построить исполняемый код-эквивалент (на умном языке это называется "понижение уровня представления"). Очевидно, что с понятием "синонимов" такое не сделаешь. Для части кодов на Си точно так же самое понятие Си является слишком высоким, и приходится опускаться на уровень машинных кодов. Но это случается довольно редко, большинство высокоуровневых конструкций достаточно описать эквивалентом на низком уровне Си

Да и вообще на любой язык я в первую очередь смотрю с точки зрения того, как код будет реально исполняться на машине, а не только на то, как выглядит его математическая модель. К слову говоря, смотря на язык только с высокого уровня, большинство программистов так и останутся кодерами, программы которых просто выполняют ТЗ, а афторы не пытаются озаботиться вопросом медленной работы кода. Точнее, пытаются, но на уровне замены умножения на 4 на сдвиг на 2, что явным образом не имеет большого смысла. А пока ты не будешь понимать, во что выливается писанина на языке программирования, эффективные программы писать не научишься



Добавлено через 3 минуты

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
Указатель - это такая же абстракция над адресом, как и ссылка
Тут уж дважды offtop, но это тоже не совсем справедливо. Это зависит от конкретной машины. В защищённом режиме "эльбруса" (к сожалению, используется то же самое слово "защищённый режим", но он не имеет никакого отношения к интеловскому понятию "защищённого режима") указатель реально есть в аппаратуре. Это не просто число, а специальная аппаратно выделенная конструкция, являющаяся защищённой аппаратной реализацией высокоуровневого понятия указателя

1
Croessmah
09.08.2017, 12:36     Что не так с нулевыми указателями?
  #20

Не по теме:

Цитата Сообщение от Evg Посмотреть сообщение
Если это был камень в мой огород
Ни в коем случае.
Это было к тому, что, например, в Visual Basic нет указателей,
но мы можем всё равно оперировать адресами, например,
передавать значения Long вместо указателей в функции WinAPI.
Если смотреть на это как через C - мы передаем указатель,
а с точки зрения языка VB - число Long, содержащее адрес объекта/функции.
Также, например, в Java нет указателей, но мы-то знаем что там внутри крутится,
и что под капотом оно всё равно всё с адресами и указателями. :)
Цитата Сообщение от Evg Посмотреть сообщение
А пока ты не будешь понимать, во что выливается писанина на языке программирования, эффективные программы писать не научишься
С этим полностью согласен.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.08.2017, 12:36

Преобразовать матрицу так, чтобы четные элементы выше диагонали матрицы и сама диагональ стали нулевыми
Дана матрица 10 на 10. Данные введены через randomize в диапазоне от 0 до 100. Преобразовать...

Сайт с нулевыми показателями - что с ним делать?
Есть сайт, тиц 0, pr 0, но в индексе яндекса и гугла. имеет ли смысл попробовать получить с него...

Что не так с кодом? ( пытаюсь понять, что не так? )
Есть исходный код. Hook, работает хорошо, но есть минус огромный - перестаёт писать в лог, при...

Не могу что-то понять с указателями
Объясните мне,пожалуйста, почему когда я пишу так: void main() { char arr=&quot;erbb45&quot;; char...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru