根据http://en.cppreference.com/w/cpp/memory/c/malloc std :: malloc返回失败
上的null ptr是无效的指针还是nullptr?
如果是nullptr,则意味着std :: malloc和c malloc之间存在差异。然后,在这种情况下,还有其他问题还有其他区别吗?
编辑:这不是评论中建议的重复。这解释了nullptr是什么,显然说它们与众不同。问题不是询问它们之间的区别。
它返回NULL
。来自C 标准的N4296草稿:
20.7.13 C库[C.Malloc]
表45描述了标题
<cstdlib>
。表45 - 标题
<cstdlib>
概要:+------------+---------------+ | Type | Name(s) | +------------+---------------+ | Functions: calloc malloc | | free realloc | +----------------------------+
- 内容与标准C库标题11相同,并具有以下更改:
- 功能
calloc()
,malloc()
和realloc()
不要通过调用::operator new()
(18.6)来分配存储空间。- 函数
free()
不会通过调用::operator delete()
来处理存储。- 直接使用
malloc()
,calloc()
或realloc()
分配的存储是隐式声明的(请参见3.7.4.3),分配时,在Dealllocation上不得声明,不需要在Dealllocation上声明,并且不需要停止以undeclare_reachable()
呼叫的结果而宣布为可达的结果。
您可以看到,C 标准委托委员会定义malloc
的C标准,并且对其返回值或类型没有进一步的限制。由于C具有NULL
但没有nullptr
,因此我们可以肯定地说malloc
返回NULL
。
,但所有这些都没有毫无意义,因为NULL == nullptr
始终是正确的,因为它们都是"无效指针常数"(在4.10指针转换中明确定义的术语[cons.ptr])。两者是等效的。
都不。
返回类型为std::malloc
是void*
。分配失败的返回值为类型void*
的空指针值。
NULL
是预处理宏。宏本身没有类型或价值。该宏可以定义为nullptr
或0
。因此,我们不能真正说std::malloc
返回NULL
。我们可以说,它返回的内容等于从NULL
回答的值转换的值。
尽管nullptr
是"无效指针字面",但它本身并不是指针。它的类型不是传统的指针类型。奇怪的是,它的类型是decltype(nullptr)
,这不是std::malloc
的返回类型。因此std::malloc
不返回nullptr
。
std::malloc
首先返回指针。nullptr
不是指针(实际上是它的全部点)。因此,std::malloc
无法返回nullptr
。
失败时,std::malloc
将返回一个指示值,该指针值定义为"零指针常数"。nullptr
是一种非分量类型,可隐式转换为" null指针常数",并且与任何指针值相等(如果指针值为" null指针常数")。
因此,如果您针对nullptr
测试返回值,则仅当std::malloc
失败时,它才能测试。
整数文字0中的宏NULL
结果(对于C )(注意:它也可以导致nullptr
,但几乎没有实现的方法)。通过C 的规则,整数字面0是隐式转换为空指针常数的,并且与任何指针值相当(如果指针值为" null Pointer Constant",则导致等效)。
因此,如果您针对NULL
测试返回值,则仅当std::malloc
失败时,它才能测试。