Второй параметр для memset
имеет тип int
.NULL
находится в C. константа пустого указателя Согласно стандарту:
Целое константы со значением 0, или такого выражением приводится к типу void *
, называется постоянной пустого указателя.
Таким образом, NULL
может быть определено как (void *)0
или его эквивалент. В таком случае ваш звонок memset
неверен, потому что вы конвертируете указатель в целое число.
Другой способ в порядке: если вы используете 0
, где ожидается нулевой указатель, компилятор выполнит преобразование для вас. Таким образом, учитывая тип T
следующие наборы как p
и q
к нулевому указателю:
T *p = NULL;
T *q = 0;
Кроме того, данный указатель p
, эквивалентны следующие:
if (p) ...
if (p != NULL) ...
if (p != 0) ...
Это потому, что 0
является special: в контекстах указателя он автоматически преобразуется в константу нулевого указателя. Указатель, с другой стороны, никогда не преобразуется в целое число неявно. Любое целое число, отличное от 0
, также никогда не преобразуется в указатель неявно.
Наконец, в коде ниже, даже если i
имеет значение 0
, это не пустой константный указатель в присвоении p
:
int i = 0;
int *p = i;
выше вызовет предупреждение при компиляции в совместимом режиме ,
(Выше немного экскурса, но я надеюсь, что это не совсем по теме.)
Не используйте NULL, если вы имеете в виду 0. – 2010-03-10 06:11:42
NULL! = NUL (еще 4) –