`

怎样在程序里获得一个空指针?

 
阅读更多

6.2 怎样在程序里获得一个空指针?

根据语言定义, 在指针上下文中的常数 0 会在编译时转换为空指针。也就是说, 在初始化、 赋值或比较的时候, 如果一边是指针类型的值或表达式, 编译器可以 确定另一边的常数 0 为空指针并生成正确的空指针值。因此下边的代码段完全 合法:
    char *p = 0;
    if(p != 0)
参见问题 5.3

然而, 传入函数的参数不一定被当作指针环境, 因而编译器可能不能识别未加 修饰的 0 ``表示" 指针。在函数调用的上下文中生成空指针需要明确的类型转换, 强制把 0 看作指针。例如, Unix 系统调用 execl 接受变长的以空指针结束 的字符指针参数。它应该如下正确调用:

    execl("/bin/sh", "sh", "-c", "date", (char *)0);

如果省略最后一个参数的 (char *) 转换, 则编译器无从知道这是一个空指针, 从而当作一个 0 传入。(注意很多 Unix 手册在这个例子上都弄错了。)

如果范围内有函数原型, 则参数传递变为 ``赋值上下文", 从而可以安全省略 多数类型转换, 因为原型告知编译器需要指针, 使之把未加修饰的 0  正确转换为适当的指针。函数原型不能为变长参数列表中的可变参数提供类型。 (参见问题 15.3) 在函数调用时对所有的空指针进行类型转换可能是预防 可变参数和无原型函数出问题的最安全的办法。

摘要:

可以使用未加修饰的 0: 需要显示的类型转换:
初始化 函数调用, 作用域内无原型
赋值 变参函数调用中的可变参数
比较  
固定参数的函数调用且在作用域内有原型  

参考资料: [K&R1, Sec. A7.7 p. 190, Sec. A7.14 p. 192]; [K&R2, Sec. A7.10 p. 207, Sec. A7.17 p. 209]; [ISO, Sec. 6.2.2.3]; [H&S, Sec. 4.6.3 p. 95, Sec. 6.2.7 p. 171]。

 

分享到:
评论

相关推荐

    怎样在程序里获得一个空指针

    那么,如何在程序中获得一个空指针呢?根据语言定义,在指针上下文中的常数 0 会在编译时转换为空指针。也就是说,在初始化、赋值或比较的时候,如果一边是指针类型的值或表达式,编译器可以确定另一边的常数 0为空...

    C语言中的空指针、空指针常量、NULL & 0.docx

    NULL是C语言的标准宏定义,它在或其他头文件中定义为一个空指针常量。尽管NULL通常被实现为(void*)0,但它实际上代表的是任何类型的空指针常量,因此在赋值给不同类型的指针时,不需要进行类型转换。例如,p = NULL...

    C语言中的空指针、空指针常量、NULL & 0.pdf

    `也可以使p成为空指针,其中NULL是一个在《stddef.h》或其他头文件中预定义的宏,用于表示空指针常量。通常,NULL的实现为`(void*)0`,但并非所有系统都如此。 关于空指针的内部实现,C标准并未规定空指针必须指向...

    你必须知道的495个C语言问题

    5.2 怎样在程序里获得一个空指针? 5.3 用缩写的指针比较“if(p)”检查空指针是否有效?如果空指针的内部表达不是0会怎样? NULL宏 5.4 NULL是什么,它是怎么定义的? 5.5 在使用非零位模式作为空指针的内部...

    《你必须知道的495个C语言问题》

    5.2 怎样在程序里获得一个空指针? 54 5.3 用缩写的指针比较“if(p)”检查空指针是否有效?如果空指针的内部表达不是0会怎样? 55 NULL 宏 56 5.4 NULL是什么,它是怎么定义的? 56 5.5 在使用非零位模式...

    C语言FAQ 常见问题列表

    o 6.2 怎样在程序里获得一个空指针? o 6.3 用缩写的指针比较 ``if(p)" 检查空指针是否可靠?如果空指针的内部表达不是 0 会怎么样? o 6.4 NULL 是什么, 它是怎么定义的? o 6.5 在使用非全零作为空指针内部...

    面向Java和Kotlin混用代码的空指针分析方法研究

    空指针异常(Null-Pointer Exception)是软件开发中常见的问题之一,它往往会导致应用程序运行异常甚至崩溃。在Android开发领域,Kotlin语言因其简洁和对空安全的严格处理而受到青睐,成为官方推荐的开发语言。然而...

    常用到的几个C程序,包括排序、指针使用等

    指针是C语言的一大特色,它是一个变量,存储了另一个变量的地址。理解指针是学习C语言的关键。在程序中,我们可以通过指针直接操作内存,这使得指针在动态数据结构、函数参数传递等方面有广泛应用。例如,通过指针...

    什么叫C语言指针?C语言的特征是什么?附带详细解析.docx

    处理指针错误通常涉及检查指针是否为 NULL,避免空指针引用。可以使用断言或异常处理机制来确保程序的健壮性。 C 语言的特点还包括: 1. 高效:C 语言接近机器级别,执行速度快。 2. 低级特性:提供对内存管理和...

    程序设计-指向指针的指针.pptx

    在这里,`p`是一个指向`char *`的指针,因此当我们使用`*p`时,实际上是解引用`p`,得到它所指向的`char *`,即字符串的首字符。`printf("%s\n", *p)`会打印出这个字符串,直到遇到空字符`\0`为止,所以每次循环都会...

    20个C语言经典指针问答.pdf

    ** 空指针是一个未指向任何有效地址的指针,通常用NULL或0表示。 7. **如何判断指针是否为空?** 通过比较指针是否等于NULL,如 `if (ptr == NULL)` 判断指针是否为空。 8. **如何动态分配内存?** 使用`malloc()`...

    struts2+spring+hibernate整合中spring注入出错。页面中报空指针异常。高手来看看怎么决绝。

    如果在页面中出现空指针异常,通常意味着某个预期被注入的对象为null。 可能的错误原因及解决方案: 1. **配置错误**:检查Spring的配置文件(如`applicationContext.xml`),确保所有需要被注入的对象(如Service...

    C 语言编程常见问题解答.chm

    11.5 怎样获得一个能报告条件失败的程序? 第12章 标准库函数 12.1 为什么应该使用标准库函数而不要自己编写函数? 12.2 为了定义我要使用的标准库函数,我需要使用哪些头文件? 12.3 怎样编写参数数目可变...

    你必须知道的495个C语言问题(PDF)

    5.2 怎样在程序里获得一个空指针? . . . . . . . . . . . . . . . . . . . 21 5.3 用缩写的指针比较“if(p)” 检查空指针是否可靠?如果空指针的内 部表达不是0 会怎么样? . . . . . . . . . . . . . . . . . . . ...

    【C语言】两个指针的坑

    指针在使用不当的情况下非常容易出现问题,尤其是内存越界、野指针(未初始化或者已经释放的指针)、空指针访问等,都会造成程序的运行时错误,甚至导致程序崩溃(core dump)。以下从给出的内容中提取知识点并详细...

    指针,指针类型,指针函数

    指针是C/C++编程语言中的一个核心概念,它在程序设计中扮演着至关重要的角色。指针可以被视为存储内存地址的变量,这些地址指向其他数据类型的数据。通过指针,我们可以直接操作内存中的数据,这使得代码更加灵活且...

Global site tag (gtag.js) - Google Analytics