2015-07-15 6 views
0

Я немного смущен, когда вы передадите NULL в качестве параметраNULL в качестве параметра

, например

int* array_create(int* array,size) 
    { 
    array = new int[size]; 
    return array; 
    }  

    int main() 
    { 
    int* array = array_create(NULL,10);//can we pass NULL in this case? 
    delete[] array; 
    return 0; 
    } 

Я знаю пример любопытное глупо, но мне интересно, если мы можем передать NULL в качестве параметр, когда функция присваивает некоторую кучную память указателю и возвращает его?

+3

Да, вы можете. Хотя с помощью C++ 11 вместо этого мы используем nullptr. Однако в этом случае нет смысла иметь массив в качестве параметра. – drescherjm

+0

@ drescherjm не мог придумать лучшего примера. Я хотел знать, что когда вы передаете NULL, у вас нет переменной, например, как 'array = new int [size]', я не был уверен, что NULL будет работать – GalaxyVintage

+0

'array' по-прежнему является переменной, значение равно NULL (или 'nullptr'). –

ответ

2

Когда вы называете функции, как это ...

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.

+0

Я думал в оригинале внутри функции, он использует массив переменных, и я был смущен тем, что будет создано, если я передам nullptr – GalaxyVintage

+0

@Lzy: так вам сейчас ясно или все еще нет конечно? Если нет, задайте несколько вопросов или объясните свое понимание, чтобы мы могли попытаться помочь дальше .... –

+0

спасибо за ответ, теперь я получил его – GalaxyVintage

1

Просто подведение из комментариев:

Да, это вполне допустимое, но в вашем примере это совершенно бесполезно (вы знаете, что)

Некоторых примеров в реальном коде:

В OpenGL вы можете сказать API, если данные, которые вы хотите, приходит из вне из буфера:

glBufferData(..., nullptr); 

Но подождите! Это не null, это nullptr?

Ну, в компиляторе C++ 11 nullptr - лучший вариант. Поскольку NULL часто обычно разрешает 0, версию метода, которая принимает int вместо указателя, компилятор выберет int.

Вот еще некоторые данные о том, что:

http://en.cppreference.com/w/cpp/language/nullptr

Кроме того, если вы хотите изменить массив, вы должны передать указатель на указатель.

+0

также я забыл спросить, когда мы передаем NULL, какой тип? cuz в функции, параметр должен быть 'int *', и внутри функции он использует 'array' (в примере). Когда NULL передается, будет ли это' NULL = new int [size] ' ? – GalaxyVintage

+0

Нет. Вы присваиваете массиву int * значение, возвращаемое новым int [size]. Старое значение будет отброшено. Вот почему бесполезно использовать этот аргумент в этой функции. –

+0

, но когда передается Ithe nullptr, где находится 'new int [размер]', переданный? – GalaxyVintage

Смежные вопросы