在C中返回NULL指针
returning NULL pointer in C
我之前对这个问题有一些不同的答案,所以决定在这里再问一次。
假设我有一个函数node* foo()
,如果有人失败了,我做return NULL
。这个代码真的返回NULL
指针吗?或者这是NULL
还是local temporary object
?我在编译它的时候没有任何警告。另外,我可以写这样的东西:
node* ptr = foo();
if (ptr)
printf("Not NULL");
else
printf("NULL");
这似乎奏效了。(但如果此函数是,例如const string& foo()
,则不是)
NULL
是一个指针文字,它被定义为包含一个特殊值。
一个可能的定义是:
#define NULL ((void *)0)
有关更多详细信息,您可以阅读此常见问题
关于const string& foo()
,我相信你指的是C++的std::string
。std::string没有用NULL指针初始化它的隐式构造函数。因此,您应该使用一些异常或空字符串来向调用方指示错误。(如果你不抛出,你必须返回一个std::string
。即使返回的对象是局部的,当保存在局部常量引用中时,它的寿命也会延长。但返回其他类型并期望隐式转换不是一个好主意。)
回答您的问题:因为NULL是一个文字,所以大多数时候可能不会创建临时对象,实际值可以直接返回给调用者。
此函数
const string& foo();
不返回指针。它返回对std::string类型对象的常量引用。因此,它的返回值可能不会分配给指针。
根据C++标准
4.10指针转换[conv.ptr]
1空指针常量是值为零的整数文本(2.14.2)或std::nullptr_t类型的prvalue。空指针常量可以转换为指针类型;结果是该类型的空指针值,并且可以与对象指针或函数指针类型的其他值区分开来。这种转换称为空指针转换。相同类型的两个空指针值应比较相等。将空指针常量转换为指向cv限定类型的指针是一次转换,而不是指针转换后再进行限定转换的顺序(4.4)。整型的空指针常量可以转换为std::nullptr_t类型的prvalue。[注意:生成的prvalue不是空指针值。--结束注释]
因此,当您使用宏null定义的空指针常量时,它会被分配给函数的返回指针,该函数将包含类型为node *
的空指针值
通常NULL
字面意思是指针不指向任何东西——通常情况下,值0
表示什么都不指向。不管是C
还是C++
。
当您返回NULL或其他任何值时,返回值可能保存在堆栈上(或CPU寄存器中)。因此,您在那里得到了一个临时的"匿名"变量,它只存在于您调用函数的行上。
这是由编译器以某种实现定义的方式"在行之间"完成的。不要将其与函数内部局部变量的作用域混淆。
当然,编译器可能会决定通过对代码进行某种形式的内联函数优化来优化整个参数/返回值的混洗。
至于返回引用,将引用设置为NULL没有任何意义。引用应该指向一些已分配的内存。如果您有一个返回引用的函数,它很可能指向其中一个传递的参数。返回NULL是一种简单的C错误处理方法。在C++中,您有更多的选择,比如抛出异常。
- 当使用通配符和null指针调用函数时,对输出的说明
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- 将位数组转换为 HBITMAP 后 bmBits 的 NULL 指针
- 在访问类的树层次结构中的对象时避免使用 null 指针
- 排序时引用绑定到 'value_type' 类型的 null 指针
- NULL指针解决方案中的C 分割故障
- 取消引用会导致崩溃,即使对于非 NULL 指针也是如此,原因也是如此
- 跟进哈希表 C++,this->next = NULL 指针
- C++中的NULL指针
- 当删除NULL指针(C/C )时,可以保证SegFault
- 引用绑定到类型 'struct value_type' 的 null 指针
- 尝试在C++中使用 NULL 指针时不会发生分段错误
- if(NULL==指针)和if(指针==NULL)之间有什么区别
- 在Linux/GCC下,将NULL指针访问转换为C++异常
- NULL指针检查线程安全
- cppcheck null指针取消引用:m_buffer-否则,针对null进行检查是多余的
- strtok() - 为什么必须传递 NULL 指针才能获取字符串中的下一个标记
- Null指针异常(int Vs char)
- 用户定义类中的Null指针无效
- 不是NULL指针,而是错误的访问错误消息