NULL作为参数

时间:2015-07-15 03:18:17

标签: c++

当您将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作为参数?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

只是总结评论:

是的,它完全有效,但在你的例子中它完全没用(你知道)

实际代码中的一些例子:

在OpenGL中,您可以告诉API您想要的数据来自缓冲区:

  glBufferData(..., nullptr);

但是等等!那不是null,那是nullptr?

在c ++ 11编译器中,nullptr是一个更好的选择。因为NULL通常通常解析为0,所以采用int而不是指针的方法的版本将由编译器选择int。

以下是关于此的更多数据:

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

另外,如果要编辑数组,则应该将指针传递给指针。