当您将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作为参数?
答案 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
另外,如果要编辑数组,则应该将指针传递给指针。