В C существует один и только один контекст, где необходимо явно указать константу нулевого указателя на определенный тип указателя, чтобы программа работала правильно. Этот контекст передает нулевой указатель через список аргументов нетипизированной функции. В modern C это происходит только тогда, когда вам нужно передать нулевой указатель на функцию, которая принимает переменное количество аргументов. (В унаследованной C, это происходит с любой функцией не объявлена с прототипом.) Парадигматический пример execl
, где самый последний аргумент должен быть нулевым указателем явно привести к (char *)
:
execl("/bin/ls", "ls", "-l", (char *)0); // correct
execl("/bin/ls", "ls", "-l", (char *)NULL); // correct, but unnecessarily verbose
execl("/bin/ls", "ls", "-l", 0); // undefined behavior
execl("/bin/ls", "ls", "-l", NULL); // ALSO undefined behavior
Да, что последний пример имеет неопределенное поведение даже еслиNULL
определяются как ((void *)0)
, потому что void *
и char *
являются не неявно равноценен при прохождении через нетипизированный список аргументов, несмотря на то, что они везде.
«Под капотом» проблема здесь не только с шаблоном бит, используемым для нулевого указателя, но для компилятора может потребоваться конкретный конкретный тип каждого аргумента, чтобы настроить вызов правильно. (Рассмотрим MC68000 с отдельными адресами и регистрами данных, некоторые ABI указали аргументы указателя, которые должны быть переданы в регистрах адресов, но целочисленные аргументы в регистрах данных. Рассмотрим также любые ABI, где int
и void *
не имеют одинакового размера. И это исчезает редко в наши дни , но C явно указывает на void *
и char *
, не имеющие того же размера.) Если есть прототип функции, компилятор может это использовать, но непрототируемые функции и вариативные аргументы не предлагают такой помощи.
C++ сложнее, и я не чувствую себя способным объяснить, как это сделать.
http://bytes.com/topic/c/answers/213647-null-c – soandos
http://www.stackoverflow.com/questions/459743/is-null-always-false – mcabral
http: // c- faq.com/null/index.html –