怎样在程序里获得一个空指针
根据语言定义, 在指针上下文中的常数0 会在编译时转换为空指针。也就是说, 在初始化、赋值或比较的时候, 如果一边是指针类型的值或表达式, 编译器可以确定另一边的常数0 为空指针并生成正确的空指针值。因此下边的代码段完全合法:
char *p = 0;
if(p != 0)
然而, 传入函数的参数不一定被当作指针环境, 因而编译器可能不能识别未加修饰的0 “表示” 指针。在函数调用的上下文中生成空指针需要明确的类型转换,强制把0 看作指针。例如, Unix 系统调用execl 接受变长的以空指针结束的字符指针参数。它应该如下正确调用:
execl(“/bin/sh”, “sh”, “-c”, “date”, (char *)0);
如果省略最后一个参数的(char *) 转换, 则编译器无从知道这是一个空指针,从而当作一个0 传入。(注意很多Unix 手册在这个例子上都弄错了。
如果范围内有函数原型, 则参数传递变为“赋值上下文”, 从而可以安全省略多数类型转换, 因为原型告知编译器需要指针, 使之把未加修饰的0 正确转换为适当的指针。函数原型不能为变长参数列表中的可变参数提供类型。在函数调用时对所有的空指针进行类型转换可能是预防可变参数和无原型函数出问题的最安全的办法。
char *p = 0;
if(p != 0)
然而, 传入函数的参数不一定被当作指针环境, 因而编译器可能不能识别未加修饰的0 “表示” 指针。在函数调用的上下文中生成空指针需要明确的类型转换,强制把0 看作指针。例如, Unix 系统调用execl 接受变长的以空指针结束的字符指针参数。它应该如下正确调用:
execl(“/bin/sh”, “sh”, “-c”, “date”, (char *)0);
如果省略最后一个参数的(char *) 转换, 则编译器无从知道这是一个空指针,从而当作一个0 传入。(注意很多Unix 手册在这个例子上都弄错了。
如果范围内有函数原型, 则参数传递变为“赋值上下文”, 从而可以安全省略多数类型转换, 因为原型告知编译器需要指针, 使之把未加修饰的0 正确转换为适当的指针。函数原型不能为变长参数列表中的可变参数提供类型。在函数调用时对所有的空指针进行类型转换可能是预防可变参数和无原型函数出问题的最安全的办法。
【怎样在程序里获得一个空指针】相关文章
2. 用缩写的指针比较"if(p)" 检查空指针是否可靠?如果空指针的内部表达不是0会怎么样?
3. 如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
4. 怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返回 指向字符的指针的函数的指针的数组?
5. 在使用非全零作为空指针内部表达的机器上, NULL是如何定义
6. 空指针到底是什么
7. 怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
8. 我能否用void** 指针作为参数, 使函数按引用接受一般指针
10. 写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
本文来源:https://www.mianshiwenti.com/a13101.html
进入下载页面
﹝怎样在程序里获得一个空指针﹞相关内容
- 写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔
- Oracle面试题:如何把一个表从一个schema到另一个schema
- 我想声明一个指针并为它分配一些空间, 但却不行。这些代码有什么 问题?char *p; *p = malloc(10);
- 我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?
- C语言中一个结构不能包含指向自己的指针吗
- JVM是一个编译程序还是解释程序
- 一个面霸的自述:我是如何获得五十万年薪的工作
- 如何判断一段程序是由C 编译程序还是由C++编译程序编译的
- 为了做好你份外之事,怎样获得他人的帮助?
- 一个7年老员工的离职总结:如何打造一个最强大的“自我”