Когда вы называете функции, как это ...
int* array = array_create(NULL,10);//can we pass NULL in this case?
... вы получаете поведение как:
int* array_create(...)
{
int* array = NULL;
size_t size = 10; // using size_t as you'd missed any type
array = new int[size];
return array;
}
В конечном счете, array
инициализируется NULL
затем вскоре после этого перезаписана с значение возвращается new
, поэтому инициализация не имеет никакой цели.
Для этого кода, не был просто никакого смысла пропускания array
аргумента ... вы могли бы создать локальную переменные непосредственно:
int* array_create(size_t n)
{
int* array = new int[size];
return array;
}
... или даже ...
int* array_create(size_t n)
{
return new int[size];
}
Мне интересно, можем ли мы передать NULL в качестве параметра, когда функция присваивает некоторую кучную память указателю и возвращает его?
Это требование не имеет большого смысла, поскольку две вещи не связаны друг с другом. Вы можете передать все, что захотите, и вернуть все, что захотите.
Чаще всего, функция может сделать что-то вроде:
void dump_bytes(std::ostream& os, unsigned char* p, size_t n)
{
if (p)
for (size_t i = 0; i < n; ++i)
os << static_cast<int>(p[i]) << ' ';
}
В dump_bytes
, указав p
значение NULL
потерпит неудачу условия if (p)
, обеспечивая функцию не вызвать неопределенное поведение разыменовывая с помощью указателя NULL, даже если n
не был 0
.
Да, вы можете. Хотя с помощью C++ 11 вместо этого мы используем nullptr. Однако в этом случае нет смысла иметь массив в качестве параметра. – drescherjm
@ drescherjm не мог придумать лучшего примера. Я хотел знать, что когда вы передаете NULL, у вас нет переменной, например, как 'array = new int [size]', я не был уверен, что NULL будет работать – GalaxyVintage
'array' по-прежнему является переменной, значение равно NULL (или 'nullptr'). –